Android Quick APIs Reference
اندروید سیستم
عاملی است که در همه جا دیده میشود، از تلفنهای موبایل و تبلتها گرفته تا
تلویزیونها، SetupBoxها، و اخیراً در دستگاههای پوشیدنی. شیوع
این سیستم در جهان بیش از هر سیستم مشابهای است و برنامه نویسان زیادی برای آن
برنامه تولید میکنند. از زمان انتشار این کتاب، حدود 8 سال از ظهور اندروید میگذرد
و در طی این مدت 5 نسخه عمده از این سیستم عامل توسط کمپانی گوگل منتشر شده است.
با توجه
به جدید بودن این سیستم عامل، و کلاً جدید بودن حوزه نرمافزار موبایل، اندروید
مفاهیم جدیدی را نیز با خود به همراه آورده. این مفاهیم برای برنامهنویسان سنتی
تا اندازه زیادی ناآشنا و گنگ بنظر میرسد. اصطلاحاتی از قبیل Activity, View, Intent, Drawable
، ... و غیره. درواقع
بسیاری از این اصطلاحات و مفاهیم جدید نیستند و بخاطر رقابتهایی که کمپانیهای
مختلف با یکدیگر دارند، در قالب جدیدی نسبت به قبل عرضه شدهاند و فقط اسم آنها
عوض شده. ولی در برخی از موارد نیز مفاهیم جدیدی ارائه شده که مختصِ تکنولوژیهای
موبایل هستند. به چند دلیل معادلیابی دقیق برای این اصطلاحات مشکل است، که من در
اینجا به چند نمونه از آنها اشاره میکنم:
- این اصطلاحات معنی دقیقی
ندارند، حتی در زبان اصلی. مسلم است که برای هر چیز جدیدی باید نام و اصطلاحی را ابداع کرد. ولی
متاسفانه اکثر اصطلاحاتی که در سالهای اخیر توسط کارشناسان نرمافزار ارائه شدهاند
فيالبديهه ساخته میشوند و خیلی به معانی عمقی، و حتی سطحی آنها، توجه نمیشود.
به معنای ظاهری اینگونه اصطلاحات نباید توجهای نشان داد و برای درک آنها باید
توضیحات مربوطه را مطالعه کرد.
- برای اینگونه اصطلاحات
ترجمههایی در زبان فارسی موجودند ولی معنی درست و روشنی ندارند. در بسیاری از کتابهای علوم رایانهای که به
زبان فارسی ترجمه شده، از لغاتی استفاده میشود که از قبل موجود بودهاند، ولی
متاسفانه این لغاتِ فارسی نیز معنی روشنی ندارد و ممکن است فقط معادلی باشد برای
یکی از معانی لغت اصلی، معنی که هیچ ربطی به زمینه فعلی ندارد. بکارگیری این لغات
در ترجمه نیز نامفهوم و گمراه کننده است.
با توجه
به اینکه کارشناسان نرمافزار همه روزه در کار خود با لغات انگلیسی سر و کار دارند
و عليالاصول در کاربرد این لغات مشکلی ندارند، رویکرد ما در ترجمه این بوده که
بجای کاربرد برخی لغاتِ نامانوسِ فارسی، از لغت اصلی استفاده شده تا سوء برداشتی
از این اصطلاحات نشود. همچنین بدلیل ناخوانا بودن املاء فارسی مخففهایی نظیر API،
SDK،
و یا UI (یعنی اِپیآی، اسدیک، یوآی)، آنها نیز بصورت لاتین ذکر شدهاند و هرجا
هم که لازم بوده بصورت ترکیب فارسی جمع بسته شدهاند، مانند ”APIها“.
درباره
کتاب
کتابهای
زیادی برای آموزش برنامهنویسی اندروید موجود است که حجم اغلب آنها بین 500 تا 1500 صفحه است. محتوای
اکثر این کتابها را لیستهای طولانی مربوط به پروژهها تشکیل میدهند. مطالعه
کتابهای مفصل برای بیشتر افراد خسته کننده است و خیلی وقتها خواندن آنها ناتمام
میماند. ولی در این کتاب توسعه برنامههای اندرویدی با مثالهایی ساده و کوتاه
توضیح داده میشود. مزیت این کتاب در این است که علاوه بر سادگی و پوشش دادن اکثر
مباحث اصلی مربوط به برنامه نویسی اندروید، حجم آن نیز نسبت به کتابهای مشابه کمتر
است و خواننده بدون آنکه از ناتمام ماندن آن نگرانی داشته باشد، میتواند آن را در
مدت کوتاهی مطالعه کند.
درباره
نویسنده
اُنُر
چنار (Onur Cinar) مهندس نرمافزار
تُرک تباری است که فعلاً بعنوان مدیر توسعه در بخش Skype مایکروسافت درگیر پروژههایی
نظیر Skype Qik،
GroupMe، و Skype for Android
میباشد. وی در زمینه طراحی، توسعه و مدیریت پروژههای بزرگ و پیچیده دارای 19 سال
سابقه کار است. از کتابهای دیگر وی میتوان از ”Android Apps with Eclipse“ و ”Pro Android C++ with the NDK“
را نام برد.
کامران
بزرگزاد
تابستان 1394
حالا
دیگر سیستم عامل اندروید فقط مختصِ دستگاههای موبایل نیست. این سیستم در طیف
وسیعی از دستگاهها مثل تلویزیونها، و دستگاههای پوشیدنی نیز بکار میرود.
اندروید با مجموعه وسیعی از APIهایی که دارد، فرصتهای بیشماری را در اختیار برنامهنویسان
قرار داده است.
کتاب
”خودآموز سریع برنامه نویسی اندروید“ شامل مثالهایی کوتاه، و نیز مرجع مختصری
برای API سیستم عامل اندروید است. این کتاب همچنین APIهایی را دربر میگیرد که در آخرین نسخه
اندروید، یعنی نسخه 5.0 (یا آبنبات چوبی)، معرفی شدهاند.
در این کتاب APIهای اندروید طوری سازماندهی شدهاند که
بتوان از آنها بعنوان یک مرجع راهنمای ساده استفاده کرد.
به منظور
اینکه بتوانید مطالب مربوط به APIها را با عمق بیشتری مطالعه کنید، در این کتاب بطور
گسترده به لینکهایی اشاره شده که شما را به صفحات رسمی مربوط به APIها هدایت میکنند. کتاب با اطلاعاتِ مفیدی
پر شده و داشتن آن برای هر برنامهنویس موبایل و یا برنامهنویس اندروید ضروری
است.
شما در
این کتاب مطالب زیر را یاد خواهید گرفت:
§
مقدمه کوتاهی بر سیستم عامل
اندروید و محیط توسعه آن.
§
اجزاء اصلی برنامههای
اندروید، مثل رابط کاربر، اخطار دهندهها، و منابع.
§
ذخیرهسازی و دسترسی به دادهها
با استفاده از APIهای اندروید.
§
دسترسی به موقعیتِ کاربر، و
نیز استفاده از حسگرهای دستگاه.
§
ضبط و پخش محتوای صوتی و
تصویری، و دسترسی به دوربین دستگاه.
این کتاب
میتواند بعنوان یک مرجعِ سریع مورد استفاده برنامه نویسان باتجربه اندروید قرار
گیرد. کسانی که بتازگی شروع به برنامه نویسی اندروید کردهاند نیز میتوانند از آن
بعنوان مقدمهای برای مطالعات خود استفاده کنند.
اندروید
سیستمعاملی است که مخصوصاً برای دستگاههای قابلحمل (mobile)،
از قبیل گوشیها و تبلتها، طراحی شده. این سیستم ترکیبی است از یک سیستم عامل، به
همراه کتابخانههای بومی (native
libraries)، برنامههای حیناجراء (application
runtime)، و یک چهارچوب برنامه (application framework). با تکیه بر اینها، ما در این فصل مرور
مختصری بر سیستم اندروید و نقش هر یک از این اجزاء در معماری کلی سیستم خواهیم
داشت. تمرکز این کتاب بر روی نسخه 5.0 اندروید خواهد بود،
که بانام آبنباتچوبی (Lollipop) شناخته میشود و در
هنگام نوشتن این کتاب آخرین نسخه ارائه شده رسمی از این سیستم عامل است.
به منظور
اینکه اندروید زیربنای مستحکمی را فرهم آورد تا نیاز دستگاههای موبایل برآورده
شود، این سیستم بر چند تکنولوژی متنباز (open source)
تکیه کرده است. زیربنای این معماری را میتوان بصورت پنج لایه اصلی توصیف کرد که
هر یک از آنها کار متفاوتی را انجام میدهند. شکل 1-1 معماری سطح-بالای سیستم
اندروید را در قالب این پنج لایه اصلی، به همراه اجزای فرعی هر یک از آنها نشان میدهد.
شکل 1-1. طرح زیربنایی معماری اندروید
در این
بخش ما هر یک از این لایههای اصلی را از پایین به بالا بررسی خواهیم کرد.
لایه
پایینی زیربنای اندروید را هسته لینوکس تشکیل میدهد. اندروید برای اینکه بعنوان یک
سیستم عامل عمل کند به هسته لینوکس متکی است. لینوکس یک سیستم عامل قابل
انتقال (Portable)
یونیکس-مانند (UNIX-like) است
که از استاندارد POSIX
پیروی میکند. لینوکس یک سیستم عامل متنباز است و آزادانه توسعه داده میشود.
به منظور اینکه
نیازهای دستگاههای موبایل رفع شود، در هستهِ لینوکسِ اندروید تغییرات ساختاری
انجام گرفته است. در این بخش ما به طور مختصر مهمترین مواردی که در هسته لینوکس
گنجانده شده را بررسی میکنیم.
اندروید
بطور گستردهای از ارتباطات میان-پردازشی (IPC[1]) استفاده میکند. برنامههای
مختلف توسط IPC
با سیستمعامل، گوشی، سرویسها، و با برنامههای دیگر ارتباط برقرار میکنند.
بدلیل اینکه مکانیزم IPC
که توسط سیستم عامل لینوکس فراهم آمده برای دستگاههای قابلحمل بهینه نیست، اندروید به سیستم IPC خود متکی است، که متصل
کننده (Binder)
نام دارد. کانال ارتباط مرکزی در تمامی اندروید را این سیستم تشکیل میدهد. بدلیل
اینکه متصل کننده در هستهِ لینوکسِ اندروید بصورت یک سرویسِ سطح-پایین پیادهسازی شده، انتظار نمیرود که برنامهنویسان بصورت
مستقیم با آن سر و کار داشته باشند. اکثر رابطهای برنامه نویسی (یا همان API)
برای تعامل با سیستم به شکلی از متصلکنندهها استفاده میکنند که از دید برنامهنویس
پنهان است.
به منظور
اینکه متصل کننده با
دیگر برنامههای سیستم تعامل برقرار کند، ابزارهای توسعه نرمافزارِ اندروید (یا SDK Android)
زبانی را فراهم آورده که به AIDL[2] معروف است. AIDL به برنامهنویس اجازه
میدهد تا یک میانجی (interface)
را تعریف کند که هم برنامهها بتوانند با یکدیگر ارتباط برقرار کنند و هم یک
برنامه با یک سرویس (service)
ارتباط برقرار کند. AIDL مکانیزمی را فراهم میکند
که از آن طریق شیء عبور داده شده به اجزائی ابتدایی تجزیه میشوند که متصل کننده
آنها را درک کند و بتواند در میانِ پردازشها از آنها استفاده کند. شما در فصل 3 مطالب کاملتری در مورد AIDL یاد خواهید گرفت.
اساسیترین
ابزار برای رفع اشکال یک برنامه واقعه نگاری (Logging)
است. برنامههای موبایل بشدت به محیطهای که آنها را احاطه کرده وابستهاند، محیطهایی
از قبیل شبکههای WiFi
و یا دادههایی که از حسگرهای (sensors)
دستگاه میرسند. به همین جهت برای رفع اشکالهای پیچیده که شامل چنین محیطهایی
میشود، واقعه نگاریهای معمولی که در درون برنامه و توسط برنامه نویس انجام میشود
کافی نیست. بنابراین، ضروری است که هم واقعهنگاریهایی که توسط سیستمعامل ثبت میشود،
و هم آنهایی که توسط برنامه ثبت میشوند با یکدیگر ترکیب شده تا یک تصویر کامل از
آنچه اتفاق افتاده بدست آید.
انجام این
کار در برنامههای موبایل به مراتب دشوارتر است، زیرا توسعه برنامه و اجراء آن در
دو دستگاه مختلف انجام میگیرند[3].
به همین
منظور، سیستم اندروید یک سرویس واقعه-نگاری
متمرکز را فراهم آورده که میتواند وقایعی را که هم از طرف خود سیستم عامل میآیند،
و هم آنهایی که از طرف برنامهای که بر روی این سیستم اجراء میشود را با یکدیگر
جمع کرده و آنها را در اختیار برنامهنویس قرار دهد.
SDK اندروید ابزارهای لازم برای بازبینی وقایع ثبت شده
را بصورت بلادرنگ (real-time)
فراهم آورده که از فیلترهای پیشرفته نیز پشتیبانی میکنند.
سیستم
اندروید مخصوصاً طوری طراحی شده که بتواند بر روی دستگاههای موبایل که
منابع محدودی دارند عمل کند. مهمترین نمونه از این نوع منابع باطری است، و به همین
دلیل دستگاههای اندرویدی اغلب به حالت توان-پایین (low-powered)
میروند، که به آن حالت خواب (sleep mode)
نیز گفته میشود. گرچه این حالت اجازه میدهد که دستگاه از توان موجود بطور موثری
استفاده کند، ولی هنگامی که یک سرویس، و یا یک برنامه، درحال انجام یک عملیات مهم
است، ما نمیخواهیم دستگاه به حالت خواب برود.
به منظور
اینکه برنامهها بتوانند از بخواب رفتن دستگاه جلوگیری کنند، قفلهای بیدارباش (Wake locks)
به هستهِ لینوکسِ اندروید اضافه شد.
|
از قفلهای بیدارباش باید با احتیاط استفاده شود. جلوگیری از بخواب رفتن دستگاه نهایتاً باعث میشود تا توان باطری تمام شود. برنامهها باید هر چه زودتر، و پس از اتمام کارهای مهم خود، قفل بیدارباش را آزاد کنند. |
تایمرهای بیداری
همانطور
که در بخش ” قفلهای بیدارباش“ اشاره شد، دستگاههای اندرویدی برای صرفهجویی در
مصرف برق به حالت خواب میروند.
در طول حالت خواب هیچ برنامهای نمیتواند اجراء شود، حتی سیستم عامل نیز متوقف میشود.
به منظور اینکه برنامهها بتوانند کارهای زمانبندی شده (scheduled)
خود را انجام دهند، تایمر بیداری (alarm timer)
به هستهِ لینوکسِ اندروید اضافه شد. هنگامی که تایمر بیداری از قبل تنظیم شود میتواند
دستگاه را از حالت خواب بیدار کند.
مانند
باطری، حافظه نیز یکی از منابع محدود دستگاههای موبایل را تشکیل میدهد. درکنار
حجم محدود حافظه، بارگذاری برنامهها در حافظه نیز کاری پرهزینه است. برای غلبه بر
این مشکل، اندروید کلیه برنامههایی که شروع شدهاند را در حافظه نگاه میدارد،
حتی آنهایی که کاربر تعاملی با
آنها ندارد. اینکار اجازه میدهد تا کاربر بتواند سریعاً برنامه جاری را عوض کند.
البته این
بهینهسازی بهایی نیز دارد، و آن این است که به هر اندازه که برنامههای جدیدی
شروع شوند، حافظه دستگاه نیز به همان میزان رو به اتمام میگذارد. به همین منظور، برنامه
کُش (low
memory killer)، که به قاتل وایکینگ (Viking
Killer) نیز مشهور است، به هستهِ لینوکسِ اندروید اضافه شد، که
تا قبل از اینکه حافظه دستگاه تمام شود، حافظه مصرف شده بازپسگرفته شود.
همانطور
که حافظه دستگاه از یک آستانه مشخص شروع به کم شدن میکند، برنامه کُش برنامهها
را از حافظه برمیدارد، و این کار را با برنامههایی شروع میکند که اهمیت کمتری
دارند.
اینکه چه
برنامهای اهمیت کمتر، یا بیشتری، دارد از روی میزان پیدا بودن آن برای کاربر
تعیین میشود. برنامهیی که فعلاً در جلو دید کاربر قرار دارد مهمترین برنامه
شمرده میشود. به همین ترتیب برنامهیی که در پشت صحنه قرار دارد و پیدا نیست از
اهمیت کمتری برخوردار است. حالتِ جاریِ برنامهیی که در پشت صحنه قرار دارد از
قبل ذخیره میشود و وقتی کاربر بخواهد این برنامه را به جلو صحنه بیاورد، این
حالت دوباره بازیابی میشود.
اندروید
برای سیستمِ فایلی اصلی خود بر سیستمی بنام YAFFS2[4] تکیه دارد. سیستم YAFFS2 مخصوصاً طوری
طراحی شده که بخوبی روی فلاش چیپهای NAND عمل کند.
این سیستم
فایلی همچنین طوری طراحی شده که بروزسازی بخشهای مختلف سیستم عامل اندروید، بدون
اینکه تاثیری روی بخشهای دیگر داشته باشد، به راحتی انجام شود. این کار به این
شکل انجام میشود که بخشهای مختلف بر روی پارتیشنهای (partition)
مختلف ذخیره میشوند، و بدلیل اینکه وقتی سیستم عامل اندروید درحال اجراء است،
اجزاء کلیدی آن غیرقابل تغییر هستند، این رویکرد باعث میشود تا ویروسها و
بدافزارها نتوانند اجزاء اصلی سیستم عامل را آلوده کنند و در نتیجه سیستم امنیت
بیشتری داشته باشد.
پارتیشنهای
استفاده شده به سازنده دستگاه بستگی دارند. در زیر فهرستی از متداولترین پارتیشنها
و نقش کلی آنها در سیستم اندروید آمده است:
·
/boot: بوت
لودر (boot
loader) و هستهِ لینوکس را در خود جای میدهد. این پارتیشن فقط در هنگام آپدیت سیستم عامل قابل تغییر
است، و در حیناجراء قابل نوشتن نیست.
·
/system: سیستم فایلی اندروید، و نیز
برنامههایی که توسط سازنده دستگاه باید قبل از بالا آمدن آن بارگذاری شوند را در
خود جای میدهد.
·
/recovery: بمنظور عملیات بازیابی و تعمیرات، یک image از نسخه بازیابی (recovery)
را در خود جای میدهد تا در هنگام بازیابی بتوان از آن استفاده کرد.
·
/data: برنامهها و نیز فایلهای مرتبط
با آنها که توسط کاربر نصب شدهاند را در خود جای میدهد. این پارتیشن در حیناجراء قابل نوشتن است، ولی بوسیله
مجوزهای (permissions) سیستمِ فایلی از آن
محافظت میشود.
·
/cache: در این پارتیشن فایلهای
موقتی (temporary
files)، و آن فایلهایی که بطور مکرر مورد استفاده قرار میگیرند،
ذخیره میشود. به منظور اینکه دسترسی به اینگونه فایلها سریعتر انجام شود، در
بیشتر دستگاههای اندرویدی این پارتیشن در حافظه RAM نگاهداری میشود.
در بالای
لایه هستهِ لینوکس، مجموعهای از کتابخانههای بومی (native
libraries) قرار دارند. سرویسها و کارهایی که در لایه حیناجرای (runtime)
اندروید ارائه شدهاند، عمدتاً توسط کتابخانههای بومی انجام میشوند. مهمترین
آنها عبارتند از:
·
SQLite:
به منظور اینکه برنامههای اندرویدی بتوانند براحتی و بطور سریع به دادههای ساختیافته
دسترسی داشته باشند، اندروید یک بانک اطلاعاتی رابطهای SQL را ارائه میدهد که علاوه بر
فایلها میتواند در حافظه نیز عمل کند.
·
WebKit:
امکان نمایش HTML/CSS
و نیز اجرای JavaScript را فراهم میآورد که توسط آن برنامههای اندرویدی میتوانند از تکنولوژی
وِب بهرهمند شوند.
·
OpenGL ES:
امکان نمایش سریع تصاویر دو بعدی (2D) و سه-بعدی (3D)
را فراهم میکند.
·
Open Core:
یک چهارچوب رسانهای را فراهم میآورد تا برنامههای اندرویدی بتوانند محتواهای
صوتی و تصویری را پخش، یا ضبط، کنند.
·
OpenSSL:
امکان استفاده از پروتکلهای SSL[5] و [6]TLS را فراهم میآورد تا برنامههای
اندرویدی بتوانند بصورت امن، و با استفاده از رمزنگاری (cryptography)،
با سرویسهای دور ارتباط
برقرار کنند.
حیناجرایهای اندروید (Android
Runtimes) بخشی است که کارهای مختلف سیستم اندروید را هماهنگ میکند.
این بخش وظیفه اجرای سرویسها و
همینطور برنامههایی که در سیستم اجرا میشوند را بر عهده دارد.
جاوا (Java)
زبان رسمی برنامهنویسی اندروید است. جاوا یک زبان همه-منظوره و شیءگرا است که
مخصوصاً برای توسعه برنامههایی طراحی شده که به دستگاه خاصی وابسته نباشند. جاوا
اینکار را با ترجمه کردن
(compiling) کدهای برنامه به یک
زبان میانجی (intermediate)
تَفسیری (interpreted)،
بنام بایت کد (bytecode)،
انجام میدهد که به سیستم خاصی وابسته نیست. این بایت کدها توسط برنامهای اجرا میشوند
که ماشین مجازی جاوا (Java Virtual
Machine) نام دارد، و در سیستم مورد نظر درحال اجرا است.
حیناجرای اندروید (ART) [7] یک نوع ماشین مجازی
جاوا است
که اخیراً در اندروید نسخه 4.4 به بعد معرفی
شد و در اندروید 5.0 رسماً بعنوان ماشین
مجازی اجرای برنامههای جاوا از
آن استفاده میشود. پیش از آن، برنامههای اندرویدی توسط ماشین
مجازی دالویک (Dalvik
Virtual Machine) اجرا میشدند.
|
هر چند امروزه چنین کاری ناپسند شمرده میشود، ولی برنامههایی که برای نسخههای قدیمیتر اندروید طراحی میشوند هنوز هم باید از نظر سازگاری و درستی عملکرد با ماشین دالویک آزمایش شوند. |
در مقایسه
با دالویک که ترجمه بایتکدها
را درست در همان زمان اجراء (JIT)[8] انجام میدهد، رویکرد ART این است
که ترجمه بایتکدها
را پیش از زمان اجراء (AOT)[9] و در زمان نصب برنامه انجام میدهد. این کار
باعث میشود تا بعداً کدهای برنامه مستقیماً در محیطِ حیناجرای دستگاه اجراء شوند.
گرچه از
نسخه 5.0 به بعد، ART بعنوان ماشین مجازیِ حیناجرایِ اندروید محسوب میشود،
ولی بیشتر دستگاههای اندرویدی از نسخههای قدیمیتر اندروید استفاده میکنند که
به ماشین مجازی دالویک تکیه
دارند.
به منظور
اینکه پکیجهای (packages) تولید شده و کدهای
باینری (binaries) هم با ART و هم با
دالویک سازگار باشند، هنوز هم پکیجهای جدید بر اساس ویژگیهای دالویک ساخته میشوند.
بدلیل اینکه ماشین مجازی دالویک مخصوصاً
برای دستگاههای موبال طراحی و بهینهسازی شده، این ماشین تنها نوع بخصوصی از بایتکد
را میفهمد که به برنامههای اجرایی دالویک (DEX)[10] شناخته میشوند. در SDK اندروید
ابزارهایی ارائه شده که میتوانند در هنگام بستهبندی برنامهها (یا پکیج سازی)، بایتکدهای استاندارد جاوا را به بایتکدهای DEX ترجمه کنند. هنگامی که یک پکیج روی دستگاه نصب میشود،
ART بصورت خودکار کدهای
فرمت DEX دالویک را به کدهای
فرمت OAT، که برای ART مناسب است، ترجمه میکند.
مسئله
امنیت یکی از مواردی بوده که از ابتدای طراحی اندروید به آن توجه شده. در این
سیستم هر برنامه در یک محیط قرنطینه (sandbox)
اجراء میشود که کدها و دادههای هر برنامه را از دیگر برنامهها جدا میکند.
·
هر برنامه در یک ART مختص به
خودش اجراء میشود.
·
توسط مجوزهای سیستمعامل (permissions)
از دادههای برنامه حفاظت میشود. هر برنامه در زمان نصب خود یک حساب (account)
دریافت میکند، و سیستمعامل دسترسی حسابهای دیگر به دادههای برنامه را ممنوع میکند،
بصورتی که فقط خود برنامه به دادههای خود دسترسی دارد.
·
برنامهها فقط از طریق میانجیهای
ارتباطی که سیستم اندروید فراهم آورده میتوانند با سیستم، و یا دیگر برنامهها،
ارتباط برقرار کنند. خود این میانجیها نیز توسط مجوزهای اندروید محافظت میشود.
زیگوت (یا زآیگوت Zygote)
مادر تمام برنامههای اندروید است. زیگوت یکی از پروسههای (processes)
اصلی است که با بوت شدن سیستم آغاز میشود. زیگوت دو نقش عمده دارد:
·
هنگامی که سیستم بوت شد، زیگوت یک ماشین مجازی ART را آغاز میکند و سرویسهای اصلی اندروید، مثل توان
(Power)، تلفن (Telephony)،
محتوا (Content)، و پکیج (Package)،
را اجرا میکند.
·
همانطور که قبلاً اشاره شد، در
سیستم اندروید هر برنامه در داخل ماشین مجازی ART مخصوص به
خودش اجراء میشود. با اجراء شدن هر برنامه، یک ماشین ART جدید شروع میشود و همراه با
آن، اجزاء اندروید نیز در حافظه بارگذاری میشوند، که این کار بسیار پرهزینهای
است. زیگوت با
استفاده از مکانیزمی بنام منشعب شدن (forking) [11] این مشکل را حل میکند.
هنگامی که کاربر تقاضای اجرای یک برنامه را میکند، زیگوت خیلی ساده خودش را منشعب
میکند. در طول منشعب شدن، پروسه زیگوت موجود بعنوان یک پروسه جدید تکثیر میشود.
هم پروسه قبلی زیگوت و هم پروسه جدید هر دو از منابع قبلاً-بارگذاری شده اندروید
استفاده میکنند. این روند اجازه میدهد تا برنامهها خیلی سریع شروع شوند، و فضای
کمتری را نیز اشغال کنند.
|
در علوم کامپیوتر، انشعاب (یا شاخهشاخه شدن) عملی است که در طی آن پروسه موجود تکثیر میشود. هرچند هریک از این دو پروسه بطور مستقل اجراء میشوند، ولی پروسه جدیداً تکثیر شده دقیقاً کپی پروسه قبلی است. تا وقتی که یکی از این پروسهها سعی نکند که قسمتی از حافظه مشترک را تغییر دهد، انشعاب اجازه میدهد تا هر دو آنها در استفاده از این حافظه با یکدیگر سهیم باشند. |
چهارچوب برنامه (Application
Framework) در بالای ماشین مجازی ART اجراء میشود
و میانجی را
فراهم میآورد که برنامههای اندرویدی بتوانند با سیستم عامل و دستگاه تعامل
برقرار کنند. در اینجا سرویسهایی مانند مدیریت پکیج (Package Manager)،
مدیریت تلفن (Telephony Manager)،
مدیریت مکانیابی (Location
Manager)، و مدیریت اخطار (Notifications Manager)
در دسترس قرار میگیرند.
فضای
برنامه شامل تمام برنامههای اندرویدی است که در بالای ماشین مجازی ART اجراء میشوند.
این برنامهها هم شامل برنامههای شخص-ثالث (third-party)
است که از بازار اندروید دانلود شدهاند و هم برنامههای سیستمی، مثل دفترچه
تلفن (Contacts)،
تلفن (Phone)،
و مرورگر اینترنت (Browser).
در این کتاب شما یاد خواهید گرفت که چگونه با استفاده از میانجی
برنامه نویسی
اندروید (Android
API) برنامههایی را توسعه دهید که در فضای برنامه (application
space) اندروید اجراء شوند.
وقتی از
اندروید صحبت شود، شما اغلب میشنوید که از نسخه اندروید بصورتهای مختلفی یاد میشود.
مثلاً گفته میشود:
·
این برنامه به نسخه Jelly
Bean یا بالاتر نیاز دارد.
·
بالاخره برای گوشی من آپدیت 4.1
آمده.
· سرویس مدیریت آشکارسازی شبکه (Network
Service Discovery Manager) از API سطح 16
به بالا در دسترس است.
در این
بخش ما هر یک از این نامگذاریها و ارتباط آنها با یکدیگر را بررسی میکنیم. جدول
1-1 ارتباط آنها با یکدیگر را نشان میدهد.
در شماره
گذاری پلاتفرم (Platform)
از شمارهای استفاده میشود که تغییر آن نشان دهنده تغییرات مهمی در سیستم عامل
اندروید است. این شماره از دو (یا سه) عدد صحیح تشکیل میشود که با نقطه از هم جدا
میشوند، مثلاً مینویسند اندروید نسخه 4.0.3.
در اینجا
اولین عدد (سمت چپی) نشان دهنده شماره نسخه اصلی است و تنها وقتی زیاد میشود که
تغییر عمدهای در عملکرد سیستم عامل پدید آمده باشد. اعداد دوم و سوم نشاندهند
شماره نسخههای فرعی هستند و تغییر آنها نمایانگر تغییرات کوچک و یا رفع اشکالهایی
است که در نسخه اصلی پدید آمده. بر همین اساس، آپدیتی که از اندروید نسخه 3.2
به 4.0 انجام گیرد نشاندهنده یک آپدیت عمده است، و آپدیتی که
از نسخه 4.0 به 4.0.1 انجام شود نشاندهنده
رفع اشکالهای جزیی است.
در تاریخ
نوشتن این کتاب، آخرین نسخه اندروید بر اساس پلاتفرم، اندروید 5.1
است. سیستم عامل اندروید از زمان پیدایش نسخه 1.0 آن (در تاریخ 23
سپتامبر 2008) بطور مرتب آپدیت میشود.
بدلیل
اینکه این فقط برنامهنویسان نیستند که مخاطب این سیستم عامل تشکیل میدهند، از
آوریل 2009 به بعد، هر نسخه پلاتفرم نه فقط دارای یک شماره، بلکه دارای یک اسم رمز
نیز هست که فعلاً بر اساس نام دِسرها وشیرینیجات مختلف نامگذاری شدهاند، اسامی
مانند کیتکت (KitKat)،
آبنبات پاستیلی (Jelly Bean)،
بستنی حصیری (Ice Cream sandwich)
و آبنبات
چوبی (Lollipop).
گرچه رفع
اشکالهای جزیی سیستمعامل معمولاً از نظر توسعه دهندگان برنامه پنهان است، ولی
آپدیتهای عمدهای که در سیستم پدید میآید نشاندهنده تغییرات عمده و اضافه شدن
موارد جدید به API اندروید است.
به منظور
اینکه دنبال کردن این مفهوم سادهتر شود، نسخه گذاری API اندروید جدا از نسخه گذاری پلاتفرم و با تخصیص یک عدد صحیح، که سطح
API نامیده
میشود، انجام میگیرد. هر نسخه از پلاتفرم اندروید تنها دارای یک سطح API
مشخص است، و سطوح پایینتر توسط سطوح بالاتر پشتیبانی میشوند.
در پورتال
توسعه دهندگان اندروید، همیشه در مستندات مربوط به API،
سطح هر API
مشخص شده
جدول
1-1. تاریخ بیرون دهی،
شماره نسخه پلاتفرم، اسم رمز، و سطح API اندروید
تاریخ بیروندهی |
نسخه پلاتفرم |
اسمرمز پلاتفرم |
سطح API |
سپتامبر 2008 |
1.0 |
-- |
1 |
فوریه 2009 |
1.1 |
-- |
2 |
آوریل 2009 |
1.5 |
Cupcake |
3 |
سپتامبر 2009 |
1.6 |
Donut |
4 |
اکتبر 2009 |
2.0 |
Éclair |
5 |
دسامبر 2009 |
2.0.1 |
Éclair |
6 |
ژانویه 2010 |
2.1 |
Éclair |
7 |
می 2010 |
2.2-2.2.3 |
Froyo |
8 |
دسامبر 2010 |
2.3-2.3.2 |
Gingerbread |
9 |
فوریه 2011 |
2.3.3-2.3.7 |
Gingerbread |
10 |
فوریه 2011 |
3.0 |
Honeycomb |
11 |
می 2011 |
3.1 |
Honeycomb |
12 |
جولای 2011 |
3.2-3.2.6 |
Honeycomb |
13 |
اکتبر 2011 |
4.0-4.0.2 |
Ice Cream Sandwich |
14 |
دسامبر 2011 |
4.0.3-4.0.4 |
Ice Cream Sandwich |
15 |
جولای 2012 |
4.1-4.1.2 |
Jelly Bean |
16 |
نوامبر 2012 |
4.2-4.2.2 |
Jelly Bean |
17 |
جولای 2013 |
4.3-4.3.1 |
Jelly Bean |
18 |
اکتبر 2013 |
4.4-4.4.4 |
KitKat |
19 |
جولای 2014 |
4.4w |
KitKat+ افزونههای پوشیدنی |
20 |
نوامبر 2014 |
5.0 |
Lollipop |
21 |
شما میتوانید
از جدول 1-1 بعنوان مرجعی برای معادلیابی نسخههای مختلف اندروید استفاده کنید.
سیستم
اندروید بطور فعالی درحال توسعه است. همانطور که در جدول 1-1 نشان داده شده،
اندروید در طول چهار سال دوچار تغییرات عمدهای شده و آپدیتها و رفعاشکالهای
زیادی در آن بعمل آمده.
ممکن است
شما با نگاه کردن به جدول 1-1 پیش خود تصور کنید که بدلیل اینکه بیش از یک سال از
بیرون دهی نسخه 4.4 میگذرد پس بر روی اکثر دستگاههای اندرویدی حداقل باید
این نسخه نصب شده باشند. ولی چنین نیست. بدلیل پراکندگی بالا، جدیدتر بودن تاریخ
بیرون دهی نسخههای اندروید نشانه این نیست که اکثر دستگاهها از این نسخه استفاده
میکنند.
در جدول
2-1 آمار پراکندگی نصب نسخههای مختلف تا ماه دسامبر 2014 نشان داده شده است.
جدول 2-1 میزان پراکندگی نسخههای مختلف اندروید[12].
نسخه پلاتفرم |
اسمرمز پلاتفرم |
سطح API |
میزان توزیع |
2.2–2.2.3 |
Froyo |
8 |
0.5% |
2.3.3–2.3.7 |
Gingerbread |
9 |
9.1% |
4.0.3–4.0.4 |
Ice Cream Sandwich |
15 |
7.8% |
4.1–4.1.2 |
Jelly Bean |
16 |
21.3% |
4.2–4.2.2 |
Jelly Bean |
17 |
20.4% |
4.3–4.3.1 |
Jelly Bean |
18 |
7.0% |
4.4–4.4.4 |
KitKat |
19 |
33.9% |
فعلاً 21
سطح مختلف از API موجود است
که شما میتوانید برای توسعه نرمافزارهای جدید از آنها استفاده کنید، ولی مطمئن
شوید که جدول توزیع نسخهها را نیز درنظر گرفتهاید. هرچند سطوح بالاتر API امکانات و ویژگیهای جدیدتری را در اختیار برنامهنویس قرار میدهد، ولی به میزان
مخاطبین نیز باید توجه داشت، زیرا هر چقدر سطح API استفاده شده در برنامه کوچکتر باشد بر روی دستگاههای
بیشتری قابل اجراء خواهد بود.
گرچه
استفاده از سطوح پایینتر API بر تعداد
مخاطبین برنامههای شما خواهد افزود، ولی دست شما را برای استفاده از ویژگیهای
جدید اندروید در برنامهها تنگتر میکند. برای غلبه بر این مشکل، کتابخانه
پشتیبان اندروید (Android
Support Library) فراهم آمده. پکیج کتابخانه پشتیبان اندروید شامل یک سری از
برنامههای کتابخانهای است که امکان سازگاری برنامهها با سطوح جدیدتر API
را فراهم میآورد. این یعنی درحالی که شما برنامه خود را بر سطح 4 به بالا تنظیم
کردهاید، برنامه میتواند از امکاناتی استفاده کند که در سطوح 19 به بالا در
دسترس هستند. گنجاندن کتابخانه پشتیبان اندروید در برنامهها، روش بسیار خوبی برای
توسعه نرمافزارهای اندرویدی محسوب میشود.
|
کتابخانه پشتیبان اندروید از کلیه APIهای جدید پشتیبانی نمیکند، زیرا ممکن است آنها به ویژگیهایی نیاز داشته باشند که فقط در سطح سیستم عامل قابل دسترس است و برای فراهم آوردن آنها به ارتقاء نسخه اصلی اندروید نیاز باشد. |
هر
کتابخانه پشتیبان اندروید سطوح
API مختلفی را مورد هدف قرار میدهد و بر همین اساس
خصوصیات مختلفی را برای استفاده در سطوح پاینتر فراهم میآورد. شما باید کتابخانه
پشتیبانی را انتخاب کنید که با خصوصیاتی که به آن نیاز دارید مطابق باشد. صفحه راهنمای
ویژگیهای کتابخانه پشتیبان[13] میتواند شما را برای
انتخاب کتابخانه مورد نیازتان راهنمایی کند.
شما در
فصلهای آتی با گنجاندن کتابخانه پشتیبان اندروید در برنامههایتان بیشتر آشنا خواهید شد.
این
نخستین فصل کتاب بود. در اینجا با اصول سیستم عامل اندروید آشنا شدید. همانطور که
قبلاً بیان شد، شما بطور مستقیم با بیشتر اجزایی که در بخش ”زیربنای معماری
اندروید“ از آنها نام برده شد سروکار نخواهید داشت، هر چند دانستن این مفاهیم درک
عملکرد آندروید را، که در فصلهای بعدی خواهد آمد، برای شما آسانتر میکند.
اندروید
دارای یک محیط توسعه کامل و پیشرفته است که میتواند بر روی تمام سیستم عاملهای
مهم اجراء شود.
پروژه متن باز اندروید (AOSP)،
که یک جامعه نرمافزاری است، زنجیره ابزارهای (toolchain)
کاملی را برای توسعه نرمافزارهای اندروید فراهم آورده.
AOSP با انتخاب دقیق ابزارها از میان بهترین ابزارهای متن
باز و
یکپارچهسازی آنها، یک محیط توسعه بهینه را فراهم آورده و توانسته زنجیره ابزار
کاملی را در دسترس استفاده کننده قرار دهد. این رویکرد اجازه میدهد تا برنامهنویسان بتوانند
برنامههای خود را با ابزارهایی که از قبل با آنها آشنایی دارند توسعه دهند.
زنجیره
ابزارهای اندروید
از چهار جزء اصلی تشکیل شده. در این بخش ما هر یک از این اجزاء را مورد بررسی قرار
میدهیم.
کیت توسعه نرمافزار (SDK)
اندروید جزء اصلی زنجیره است. SDK
اندروید موارد زیر را فراهم آورده:
·
دسترسی به کتابخانه API جاوا
·
پکیجساز برنامه
·
شبیهسازهای دستگاههای موبایل
·
بهینهساز بایتکد و به مُبهمسازی (Obfuscator)
آنها
·
پُلی برای رفع اشکال برنامهها
·
برنامههای نمونه و آموزشی
·
مستندات مربوط به اندروید
از میان زنجیره
ابزارهای اندروید،
SDK تنها جزء
لازم برای تولید برنامههای اندروید است.
همانطور
که در فصل 1 اشاره شد، اندروید برای انجام کارهای سیستمعاملی خود به هسته لینوکس
تکیه دارد. ترکیب هسته لینوکس و کتابخانه C BSD
کلیه مقتضیات لازم برای اجرای برنامههای غیر-جاوا و وابسته-بهدستگاه را فراهم میکند.
به همین
جهت میتوان برنامههایی که به کارآیی و سرعت بالا نیاز دارند را با استفاده از
زبانهایی که به زبان ماشین نزدیکترند، مثل زبانهای C، C++، و یا اسمبلی نوشت. علاوه بر
افزایش سرعت و کارایی، اینکار مزیت دیگری نیز دارد و آنهم استفاده مجدد از کُد
برنامههایی است که قبلاً به این زبانها نوشته شده و حالا بدون اینکه نیازی به
دوباره نوشتن آنها به زبان جاوا باشد
میتوان از این کُدهای قدیمی استفاده کرد.
کیت توسعه نرمافزار بومی اندروید (یا NDK[14]) یک سری ابزار تکمیلی برای SDK ارائه میدهد
که با استفاده از آنها برنامهنویس قادر است کدهایی بومی[15] را بدون هیچ درزی در برنامههای مبتنی بر جاوا جاسازی کند.
NDK اندروید شامل کامپایلرها، دیباگرها (اشکالزداها)، فایلهای سرآمد (header)،
و همچنین مستندات کامل میباشد.
ابزارهای
توسعه اندروید
(ADT[16])
برای اکلیپس (Eclipse)
جزء اولین ابزارهایی بود که برای ایجاد یک محیط توسعه یکپارچه (IDE)
برای تولید برنامههای اندروید فراهم آمد. مانند دیگر ابزارهای زنجیره، اینکار نیز
با تغییرات و اضافه کردن خصوصیات جدید به اکلیپس انجام گرفت.
در ماه می
2013 گوگل یک برنامه جدیدِ IDE،
بنام اندروید استودیو (Android Studio)[17]، را برای توسعه برنامههای اندروید معرفی
کرد. اندروید استودیو نیز یک IDE
سفارشیشده (customized) است که به برنامه IntelliJ IDEA تکیه دارد. اندروید
استودیو نسبت به Eclipse ADT ویژگیهای جدیدی، مثل پشتیبانی از نسخههای مختلف و
غنیتر بودن رابط کاربری (UI)
برای ویرایش الگوها (layout)،
را فراهم میآورد. اولین نسخه باثبات (stable)
از اندروید استودیو در ماه دسامبر 2014 منتشر شد.
فعلاً
اندروید استودیو بعنوان IDE رسمی اندروید شناخته میشود و ما نیز در این کتاب
بجای اکلیپس از
اندروید استودیو استفاده میکنیم.
در این
بخش شما یاد خواهید گرفت که چگونه اندروید استودیو را روی کامپیوتر خود نصب کنید.
اندروید استودیو برای کلیه سیستمعاملهای اصلی موجود است، از جمله ویندوز، مک او
اِس، و لینوکس. به منظور اینکه کار نصب برای برنامهنویسان آسانتر شود، اندروید
استودیو و SDK اندروید باهم در یک بسته قرار داده شدهاند.
تنها پیشنیازهایی
که برای نصب اندروید استودیو وجود دارد یکی نصب JDK[18] است و دیگری JRE[19] است. زنجیره توسعه نرمافزار
از انواع مختلفی از JDK
و JRE پشتیبانی میکند،
مثلاً Open JDK،
IBM JDK، و Oracle JDK (که قبلاً به Sun JDK معروف بود). در این
کتاب ما برای یکنواختی از Oracle
JDK استفاده میکنیم.
هرچند
زنجیره توسعه نرمافزار اندروید هم از جاوای نسخه 6 و هم نسخه 7 پشتیبانی میکند،
به منظور اینکه شما برای نسخههای بعدی اندروید آماده باشید، ما توصیه میکنیم
نسخه 7 را روی کامپیوتر خود نصب کنید.
|
بدلیل اینکه اندروید بطور سریعی درحال تحول است، ممکن است ملزوماتِ نسخههای جدید زنجیره توسعه اندروید با آنچه در اینجا بیان شده متفاوت باشد. برای اطلاع از آخرین تغییرات به صفحه اندروید استودیو رجوع کنید. |
بدلیل
اینکه طریقه نصب در سیستم عاملهای مختلف با یکدیگر متفاوت است، ما در این بخش هر
یک را بطور جداگانه توضیح خواهیم داد.
در
ویندوز، هم اندروید استودیو و هم برنامههای مربوط به جاوا همه در یک بسته ارائه شدهاند. برنامه شما
را در نصب هر دو یاری میکند.
1. با استفاده از مرورگر خود به صفحه دانلود
جاوای اوراکل بروید:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
این صفحه شما را به فهرستی از گزینهها
راهنمایی میکند.
2. به گزینه مربوط به دانلود جاوا 7 بروید.
3. روی دکمه JDK کلیک
کنید تا برنامه نصب جاوا دانلود
شود. در زمان نوشتن این کتاب آخرین نسخه جاوا 8 است.
4. ویزاردِ (wizard)
نصبِ جاوا، هم JDK و هم JRE را نصب میکند. در طول این فرایند شما میتوانید
مقادیر پیشفرض انتخاب
را انتخاب کنید، و یا متناسب با نیازتان آنها را تغییر دهید.
ویزاردِ
نصب بصورت خودکار تغییرات لازم را در سیستم بعمل خواهد آورد تا هم JDK و هم JRE برای همه
برنامههای ویندوز، از جمله اندروید استودیو، قابل دسترس باشند.
1. با استفاده از مرورگر به آدرس صفحه اندروید
استودیو بروید:
http://developer.android.com/sdk/installing/studio.html
2. سیستمعاملِ شما توسط وبسایت تشخیص داده میشود
و شما به سمت دانلود اندروید استودیوی مناسب با سیستم عاملتان هدایت میشوید.
3. دکمه مربوطه را فشار دهید تا برنامه نصب اندروید استودیو
دانلود شود. در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.
4. ویزارد شما را در نصب اندروید استودیو هدایت میکند.
حالا
برنامه اندروید استودیو برای کار آماده است. در بخش بعدی شما یاد خواهید گرفت که
چگونه با استاده از اندروید استودیو یک برنامه کوچک درست کنید تا بتوانید درستی
نصب اندروید استودیو را مشخص کنید.
در Mac OS X، هم بستههای مربوط
به Java و هم
اندروید استودیو بصورت برنامههای جداگانه ارائه میشوند.
1. با استفاده از مرورگر خود به صفحه دانلود
جاوای اوراکل بروید:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. به قسمت Java 7 بروید.
3. دکمه JDK را فشار
دهید تا image مربوط به
Java 7 دانلود شود.
4. هنگامی که دانلود به پایان رسید، روی image دانلود
شده دابلکلیک کنید تا این
ایمج روی فایل سیستم سوار (mount)
شود. این ایمج دربردارنده برنامه نصب Java 7
است.
5. برنامه نصب Java 7 را اجراء کنید. این برنامه هم
JDK و هم JRE را بر
روی کامپیوتر شما نصب میکند.
ویزاردِ
نصب بصورت خودکار تغییرات لازم را در سیستم بعمل خواهد آورد تا هم JDK و هم JRE برای همه
برنامههای Mac OS،
از جمله اندروید استودیو، قابل دسترس باشند.
1. با استفاده از مرورگر به صفحه مربوط به
اندروید استودیو بروید:
http://developer.android.com/sdk/installing/studio.html
2. سیستمعاملِ شما توسط وبسایت تشخیص داده میشود
و شما به سمت دانلود اندروید استودیوی مناسب با سیستم عاملتان هدایت میشوید.
3. دکمه مربوطه را فشار دهید تا image نصبِ
اندروید استودیو دانلود شود. در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.
4. هنگامی که دانلود کامل شد روی ایمج دانلود
شده دابل کلیک کنید تا بر روی فایل سیستم نصب شود.
5. آیکن اندروید استودیو را بر روی آیکن Applications بکشید و رها کنید تا
اندروید استودیو نصب شود.
6. حالا برنامه اندروید استودیو برای کار آماده
است. در بخش بعدی شما یاد خواهید گرفت که چگونه با استاده از اندروید استودیو یک
برنامه کوچک درست کنید تا بتوانید درستی نصب اندروید استودیو را مشخص کنید.
در مقایسه
با ویندوز و یا مک او.اس، در لینوکس اوبونتو نه برنامه نصب جاوا، و نه اندروید
استودیو، بصورت برنامههای نصبی ارائه شدهاند. در اینجا هر دو برنامه بصورت
فایلهای tar ارائه میشوند که شما
باید آنها را بصورت دستی نصب کنید:
1. به منظور اینکه تنظیمات محیطی آسانتر شود، در این بخش ما فرض میکنیم
که کلیه اجزاء ”زنجیره ابزارهای توسعه
اندروید“، یعنی برنامههای مربوط به Java 7
و نیز اندروید استودیو در یک زیردایرکتوری بنام android نصب شدهاند که در home directory کاربر قرار دارد. یک
ترمینال باز کنید،
و دستور ساخت دایرکتوری android
را صادر کنید.
mkdir ~/android
2. با استفاده از دستور cd
~/android
دایرکتوری جاری را به
دایرکتوری android
تغییر دهید.
1. با استفاده از مرورگر خود به صفحه دانلود
جاوای اوراکل بروید:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. به قسمت Java 7 بروید.
3. دکمه JDK را فشار
دهید تا فایل tar
مربوط به Java 7
دانلود شود.
4. هنگامی که دانلود به پایان رسید، با استفاده
از دستور زیر فایل tar
دانلود شده را در دایرکتوری اندروید باز کنید
tar zxf ~/Downloads/jdk-7u71-linux-i586.tar.gz
نام فایل
را متناسب با نام فایل دانلود شده تغییر دهید.
1. با استفاده از مرورگر به صفحه اندروید
استودیو بروید:
http://developer.android.com/sdk/installing/studio.html
2. وبسایت سیستمعامل شما را تشخیص میدهد و
شما را به سمت دانلود اندروید استودیوی مناسب با سیستم عاملتان هدایت میکند.
3. دکمه مربوطه را فشار دهید تا فایل tar اندروید استودیو دانلود شود.
در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.
4. هنگامی که دانلود کامل شد با استفاده از
دستور زیر برنامه اندروید استودیو را روی کامپیوتر خود نصب کنید:
tar xvf ~/Downloads/android-studio-bundle-135.1641136-linux.tgz
5. حالا شما با صدور دستور زیر میتوانید
اندروید استودیو را اجراء کنید:
~/android/android-studio/studio.sh
حالا
برنامه اندروید استودیو آماده است. در این بخش شما یک برنامه ساده خواهید ساخت تا درستی
نصب اندروید استودیو را تایید کند.
برای
ایجاد یک پروژه جدید مراحل زیر را انجام دهید:
1. هنگامی که شما برای اولین بار اندروید
استودیو را اجراء میکنید دیالوگ Quick
Start برای شما نشان داده میشود:
شکل 1-2 دیالوگ Quick
Start
2. روی مورد اول، یعنی Start a new android project، کلیک کنید.
3. در اینجا دیالوگ دیگری بصورت شکل 2-2 برای
شما ظاهر میشود:
شکل 2-2 دیالوگ ایجاد پروژه جدید
4. مقدار Application Name را Hello
Android قرار دهید.
5. مقدار Company Domain را apress.com قرار دهید.
6. دکمه Next را فشار دهید.
7. همانطور که در شکل 3-2 نشان داده شده، در
این مرحله اندروید استودیو از شما خواهد خواست تا واسطِ برنامه نویسی مورد نظر خود
(یعنی سطح API آن) را مشخص کنید. برای این مقدار عدد 21 را انتخاب
کنید که مشخص کننده اندروید 5.0 یا Lollipop است.
شکل 3-2 مشخص کردن سطح API پروژه
8. همانگونه که در شکل 4-2 نشان داده شده، در
صفحه بعدی Blank Activity را انتخاب کرده و دکمه Next را فشار دهید.
شکل 4-2 انتخاب نوع activity پروژه
9. همانطور که در شکل 5-2 نشان داده شده از
مقادیر پیشفرض برای
activity پروژه استفاده کنید.
شکل 5-2 نام activity
10. برای تکمیل ویزاردِ ایجادِ پروژه جدید، دکمه Finish را فشار دهید.
11. همانطور که در شکل 6-2 نشان داده شده،
اندروید استودیو صفحهای را نشان میدهد که میتوانید پروژه جدید خود را در آن ویرایش
کنید.
شکل 6-2 صفحه ویرایشگر پروژه جدید
برای ساخت
برنامه شما میتوانید گزینه Build ➤ Make Project را از منوی
بالایی اندروید استودیو انتخاب کنید.
هنگامی که
برنامه ساخته شد، این برنامه هم میتواند در یک دستگاه اندرویدی واقعی و هم در شبیهساز (emulator)
دستگاه اندروید (که بعنوان یکی از اجزاء زنجیره توسعه روی کامپیوتر شما موجود است)
بر روی کامپیوتر اجراء شود.
برنامههای
ساخته شده میتوانند روی هر دستگاه اندرویدی اجراء شوند، البته بشرطی که نسخه
اندروید دستگاه با حداقل سطح API درنظر
گرفته شده برای ساخت برنامه برابر، و یا از آن بزرگتر، باشد.
به منظور
اینکه دستگاه اندرویدی بتواند از وجود برنامه ساختهشده بر روی کامپیوتر مطلع شده
و با آن ارتباط برقرار کند، ابتدا باید حالت USB Debug mode دستگاه فعال شود.
اینکار در دستگاههای مختلف به روشهای گوناگونی انجام میشود.
اگر نسخه
دستگاه اندرویدی شما 4.2 به بالا است، شما میتوانید
به روش زیر USB Debug mode
را فعال کنید:
1- ابتدا مطمئن شوید که دستگاه شما توسط کابل USB به کامپیوتر متصل نباشد.
2- در دستگاه اندرویدی به صفحه Setting بروید.
3- به قسمت About بروید.
|
در دستگاههای Samsung Galaxy ابتدا به More/General و سپس به About بروید. |
4- در صفحه About،
دقیقاً 7 بار مورد Build Number
را فشار دهید.
5- درصورتی که اینکار موفقیت آمیز باشد پیامی
شبیه به ”Developer mode has been
Enabled“ برای شما ظاهر میشود.
6- حالا به صفحه Settings بازگردید.
7- با Scroll کردن به پایین، شما خواهید دید که گزینه دیگری بنام Developer Options به گزینههای Settings اضافه شده.
8- در Developer
Options مورد USB Debugging را فعال کنید.
9- حالا دستگاه را با استفاده از کابل USB به کامپیوتر متصل کنید.
10-
هنگامی که دستگاه اندرویدی به
کامپیوتر متصل شد، دستگاه با نشان دادن یک دیالوگ از شما اجازه خواهد گرفت که
ارتباط USB debug را مابین این دو دستگاه برقرار کند.
11-
برای ادامه به این درخواست
پاسخ مثبت دهید.
حالا
دستگاه اندرویدی به اندروید استودیو اجازه میدهد تا برنامههای ساخته شده را اجرا
کند.
|
بدلیل
اینکه ممکن است مراحل ذکر شده برای دستگاه شما متفاوت باشد، شما میتوانید برای
اطلاع از چگونگی فعال کردن حالت USB
Debug در دستگاههای مختلف به صفحه زیر مراجعه کنید: http://www.droidviews.com/how-to-enable-developer-optionsusb-debugging-mode-on-devices-with-android-4-2-jelly-bean/ |
برای
اجرای برنامه، از نوار منوی بالایی مورد Run ➤ Run را برای تعیین دستگاهِ اجراء
کننده انتخاب کنید.
همانطور
که در شکل 7-2 نشان داده شده با اینکار دیالوگی ظاهر میشود که شما میتوانید در
آن دستگاهی را که میخواهید برنامه در آن اجراء شود را انتخاب کنید.
شکل 7-2 انتخاب دستگاههای اندرویدی متصل شده
دستگاه
مورد نظر خود را انتخاب کرده و دکمه OK
را برای اجراء برنامه بر روی آن فشار دهید.
به منظور ظاهر
شدن یک دستگاه در این لیست، حتماً لازم است که حالت USB Debug mode برای دستگاه
مورد نظر فعال شود.
|
اندروید استودیو علاوه بر اجرای برنامهها بر روی دستگاههای واقعی، میتواند آنها را بر روی شبیهسازهایی که در کامپیوتر توسعهدهنده قرار دارند نیز اجراء کند. برای اجرای برنامهها بر روی شبیهسازهای اندروید، شما بسادگی میتوانید در دیالوگ مربوط به Choose Device گزینه Launch Emulator را انتخاب کرده و از منوی مربوطه یکی از این دستگاههای مجازی را انتخاب کنید. شما میتوانید با استفاده از برنامه AVD Manager شبیهسازهای دیگری با مشخصات متفاوت ایجاد کنید. |
سیستم
اندروید برای توسعه دهندگان زنجیره ابزارهای کاملی را فراهم آورده. در این فصل شما
یادگرفتید تا چگونه یک محیط توسعه اندروید را در کامپیوتر خود ایجاد کنید، و نیز
یادگرفتید که چگونه برنامههای سادهای را با استفاده از اندروید استودیو ساخته، و
آنها را در دستگاههای واقعی و نیز در دستگاههای مجازی و شبیهسازِ اندروید اجراء
کنید. در فصل بعدی ما به تشریح ساختار یک برنامه اندروید خواهیم پرداخت.
به منظور
تولید برنامههای موبایلِ باثبات، که با یکدیگر کنشپذیر (interoperable)
باشند، اندروید مجموعهای از کامپوننتها (components)
را برای توسعه دهندگان فراهم آورده. در این فصل شما با کامپوننتهای اصلی و وظایف
آنها آشنا خواهید شد.
”Activity“[20] یا فعالیت، نامی است که به پنجره واحدی داده
میشد که در آن کاربر میتواند با دستگاه تعامل داشته باشد. بدلیل اینکه یک برنامه
اندرویدی بصورت تمام صفحه (full screen)
و در یک فضای محدود اجراء میشود، ” اکتیویتی“ نامی است که به یک پنجره برنامه
داده میشود تا نمایانگر این باشد که در این پنجره کاربر فقط بر روی یک فعالیت خاص
تمرکز دارد.
همچنین در
سیستم اندروید رویکرد محدود کردن هر صفحه به یک پنجره (یا فعالیت) باعث میشود تا
برنامهها بتوانند با مخلوط کردن اکتیویتیهای برنامههای دیگر از قابلیتهای آنها
استفاده کنند. برای مثال در دستگاه اندرویدی شما، برنامه ایمیل میتواند اکتیویتی
فهرست تماسها (contact) را احظار کند تا
کاربر از میان این لیست یک نفر را برای فرستادن ایمیل انتخاب کند. استفاده مجدد از
اکتیویتی برنامههای دیگر باعث میشود تا کُد کمتری نوشته، و یکپارچگی سیستم نیز
حفظ شود. شما در بخش ”اهداف“ یادخواهید گرفت که چگونه برنامهها میتوانند با
یکدیگر ارتباط برقرار کرده و از اکتیویتیهای یکدیگر استفاده کنند.
تقریباً کلیه
اکتیویتیها نیاز دارند تا با کاربر تعامل برقرار کنند، و به همین دلیل، این اکتیویتی
است که وظیفه ایجاد پنجره و چیدمان اجزاء واسط کاربر (UI)[21] در آن پنجره را برعهده دارد. در فصل 4 شما
درباره انواع مختلف کامپوننتهای UI مطالبی را خواهید
آموخت.
همانطور
که در لیست 1-3 نشان داده شده، شما بسادگی میتوانید با منشعب کردن یک کلاس جدید از
کلاس android.app.Activity[22] یک اکتیویتی جدید ایجاد
کنید.
لیست 1-3. ایجاد یک اکتیویتی جدید
package com.apress.helloworld;
import android.app.Activity;
public class MyActivity extends Activity {
}
منشعب
کردن یک کلاس از کلاس Activity بطور
خودکار باعث نمیشود تا اکتیویتی جدید برای شما قابل استفاده باشد. بدلیل اینکه اکتیویتیها
نقشهای متفاوتی را در یک برنامه برعهده دارند، اندروید به برخی از فرادادهها (meta
information) درباره این اکتیویتی جدید نیاز دارد. این فرادادهها
باید بعنوان بخشی از فایل اعلانیه اندروید (Android
manifest file)، که یک فایل XML است، در تَگ[23] <activity>[24]
ارائه شوند (به لیست 2-3 نگاه کنید).
لیست 2-3. اعلان یک اکتیویتی جدید در فایل AndroidManifest.xml.
<?xml
version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.apress.helloworld" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name=
"android.intent.action.MAIN" />
<category android:name=
"android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
همانطور که در لیست 2-3 دیده میشود، تگ <activity> با گرفتن نام اکتیویتی، عنوان، و اینکه چگونه باید برای کاربر نمایش داده شود، اکتیویتی جدیدی را اعلان میکند.
منظور از
چرخهِ حیات یک اکتیویتی مجموعه حالتهایی است که یک اکتیویتی از زمانی که ایجاد میشود تا زمانی که نابود میشود به خود میگیرد.
|
چرخهِ حیات یک برنامه اندروید نسبت به یک برنامه معمولی PC به مراتب پیچیدهتر است. چرخه حیات یک برنامه PC مستقیماً تحت کنترل کاربر قرار دارد (یعنی هر وقت کاربر بخواهد میتواند آنرا شروع کند یا خاتمه دهد). ولی در اندروید، به منظور بهینهسازیِ استفاده از منابع، این سیستم عامل است که چرخه حیات اجزاء مختلف را مدیریت میکند. |
یک اکتیویتی
در طول حیات خود از هفت مرحله عبور میکند. اکتیویتی با استفاده از مِتدهای بداماندازی (hook)
که در کلاس Activity تعریف
شدهاند از وضعیت فعلی خود آگاه میشود. هنگامی که وضعیت یک اکتیویتی تغییر میکند،
برنامهنویس با بازنویسی (override)
این مِتدها میتواند عمل مورد نظر خود را حاصل کند. این متدها در لیست 3-3 نشان
داده شدهاند.
لیست 3-3.
مِتُدهای بداماندازی چرخه حیاط یک اکتیویتی میتوانند توسط
برنامهنویس دوباره بازنویسی شوند
public class MyActivity extends Activity {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
شکل 1-3 ترتیب فراخوانی این متدها توسط سیستم اندروید را در زمانی که اکتیویتی حالتهای مختلفی را در چرخه حیات به خود میگیرد نشان میدهد.
شکل 1-3. ماشینِ
حالت (state
machine) چرخه حیات یک اکتیویتی
|
به خاطر داشته باشید که در هنگام بازنویسی متدهای تغییرِ حالت، ابتدا متدهای کلاس منشعب شده (super class)[25] را فراخوانی کنید. در صورتی که اینکار را نکنید ممکن است در طول اجرای برنامه خطاهای پیشبینی نشدهای رخ دهد. |
·
متد onCreate هنگام ساخته شدن اکتیویتی فراخوانده میشود. کلیه اکتیویتیها به منظور مقداردهی
اولیهِ اکتیویتی و
رابط کاربری آن (UI)،
این مِتُد را پیاده سازی (implement)
میکنند. این متد همچنین یک شیء از نوع android.os.Bundle[26] را بعنوان پارامتر میگیرد که
ممکن است حاوی حالت منجمد شده این اکتیویتی از اجرای قبلی آن باشد. در این مرحله
هنوز اکتیویتی برای کاربر مرئی نشده.
|
در اندروید برای حمل دادهها میان اکتیویتیها، سرویسها، و حتی برنامهها از یک bundle (بسته) استفاده میشود. این یک ساختار اطلاعاتی (construct) از نوع نگاشت (map) است که دادهها را بصورت جفتهای کلید/مقدار (key/value) در خود نگاه میدارد. این دادهها توسط سیستم عامل اندروید بصورت جریانی از بایتها بصورت سریالشده (serialized) در خواهند آمد و هنگامی که نیاز به خوانده شدن آنها باشد از حالت سریالشده درخواهد (deserialized) آمد و به اشیاء مناسب تبدیل میشوند. این نوع دادهها در سیستم اندروید به Parcel[27] (به معنای بسته) شناخته میشوند. |
·
متد onStart هنگامی فراخوانده میشود که اکتیویتی برای کاربر مرئی میشود. هرچند در
این مرحله اکتیویتی نمایان است، ولی هنوز تا وقتی برنامه به جلوصحنه (foregrounded)
نیامده کاربر نمیتواند با آن تعامل داشته باشد.
·
متد onResume
هنگامی فراخوانی میشود که اکتیویتی در جلوصحنه قرار داشته باشد. در این حالت، کاربر میتواند
با برنامه تعامل داشته باشد.
·
متد onPause هنگامی فراخوانی میشود که برنامه دیگر در جلوصحنه قرار نداشته باشد. بدلیل اینکه ممکن است
کاربر به برنامه بازنگردد، در این مرحله انتظار میرود که اکتیویتی حالت فعلی خود
را در یک bundle
ذخیره کند.
·
متد onStop هنگامی فراخوانی میشود که دیگر اکتیویتی برای
کاربر مرئی نباشد.
·
متد onRestart درصورتی فراخوانی میشود که اکتیویتی دوباره مرئی شود. پس از آن متد onStart
فراخوانی میشود.
·
متد onDestroy هنگامی فراخوانی میشود که سیستم اندروید بخواهد اکتیویتی را نابود (destroy)
کند.
|
بعد از بازگشت متدهای onStop یا onDestroy، ممکن است در هر زمان سیستم عامل اندروید تصمیم بگیرد تا برنامه را بِکُشد (kill). از برنامهها انتظار میرود در طول فراخوانی متد onPause حالت فعلی خود را ذخیره کنند. |
...........................................
برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.
یکی از
مهمترین اجزاء یک برنامه را منابع تشکیل میدهند. به منظور اینکه ثبات برنامه حفظ
شود، و همچنین بدلیل اینکه ممکن است به یک منبع بطور مکرر و در جاهای مختلف رجوع
شود، پس به منظور اینکه از تکرار اختصاص منابع جلوگیری شود بهتر است همیشه منابع
از کد برنامه جدا نگاه
داشته شوند. اینکار فواید زیادی دارد، از جمله:
·
بومیسازی (Localization)
برنامه: برنامهها میتوانند
برای هر زبانی از منبع جداگانهای استفاده کنند. بسته به منابع موجود، کاربر میتواند
در زمان اجراء برنامه زبان متفاوتی را برای آن انتخاب کند. این باعث میشود تا
بتوان برای یک برنامه واحد امکان بومیسازی و پشتیبانی از چندین زبان را در فراهم
آورد.
·
ظاهر
متفاوت در دستگاههای مختلف: بدلیل
اینکه سیستم اندروید وابسته به دستگاه خاصی نیست، هیچ تنظیمی وجود ندارد که رابطِ
کاربرِ کلیه دستگاههای اندرویدی یکسان بنظر برسد. برای تغییر و سفارشی
کردن (customize)
صفحه، از الگوها و تصاویری استفاده میشود که به اندازهِ صفحه و تراکم (density)
نقاط آن بستگی دارند. جداسازی منابع برنامه از کُد آن باعث میشود تا برنامه
بتواند از منابع مختلفی استفاده کند که نوع آنها به خصوصیات دستگاه (مثلاً
اندازه صفحه و غیره) بستگی دارد.
سیستم
اندروید مجموعه کاملی از APIها و ساختارها (structure)
را در اختیار برنامه نویس قرار میدهد تا بتواند منابع را سازماندهی کند و برحسب ویژگیهای
دستگاه، و یا محیط حینِ اجراء برنامه، بتواند از میان آنها منبع مناسب را انتخاب
کرده و بکار بگیرد.
در بخشهای
آتی به ساختار منابع و همچنین چگونگی دسترسی به آنها از طریق APIها خواهیم پرداخت.
کیت توسعه
نرمافزار اندروید
(SDK) برنامهها را ملزم
میکند که منابع خود را در فولدر خاصی، یعنی در زیردایرکتوری /src/main/res،
قرار دهند. همانگونه که در لیست 1-4 نشان داده شده، این برنامه دارای یک منبع
تصویری بنام icon.png
است، که در دایرکتوری drawable قرادارد. یک فایل
الگویی، بنام main.xml،
نیز در دایرکتوری layout قراردارد.
همچنین یک منبع رشتهای بنام strings.xml
نیز در دایرکتوری values قرار دارد.
لیست 1-4.
ساختار منابع برنامه
Hello
Android
|
`- src
`- main
`- res
|- drawable
| `- icon.png
|
|- layout
| `- main.xml
|
`- values
`- strings.xml
نامگذاری صحیح دایرکتوری منابع اهمیت زیادی دارد. درصورتی که منابع دارای نام صحیحی نباشند اندروید قادر به پیدا کردن آنها نیست.
سیستم
اندروید بصورت خودکار کلیه سابدایرکتوریهای منابع را ایجاد نمیکند. شما میتوانید
هر زمان که بخواهید آنهایی را که ایجاد نشدهاند بصورت دستی ایجاد کنید، به این
صورت که ابتدا روی دایرکتوری res
راست-کلیک کرده و از منوی ظاهر شده مورد
New ➤ Android Resource Directory را انتخاب میکنید تا
پنجرهای مانند آنچه در شکل 1-4 نشان داده شده برای شما ظاهر شود.
شکل 1-4. دیالوگ مربوط به ساخت دایرکتوری برای یک منبع جدید
بسته به
نوع منابع، اندروید آنها را به 9 دسته اصلی گروهبندی میکند. هر یک از این 9 گروه
سابدایرکتوری مربوط به خود را دارد که در دایرکتوری منابع (یعنی src/res)
قرار میگیرند. هنگامی که شما برنامه خود را کامپایل کردید و برنامه ساخته شد،
زنجیره ابزار اندروید بصورت خودکار یک فایلِ کلاسِ جاوا بنام R.>نام پکیج برنامه< (مثلاً com.apress.R)
را ایجاد میکند تا از این طریق بتوانید در کدِ برنامه به منابع دسترسی پیدا کنید.
در جدول 1-4 فهرستی از این 9 گروه، به همراه نام زیردایرکتوری آنها، و گروه آنها
در درون کلاس ثابتهای R
آمده است.
جدول 1-4. گروههای منابع، زیردایرکتوری آنها، نام
ثابت R آنها، و پیشوند XML مربوط به آنها
گروه منبع |
زیردایرکتوری |
رجوع در کد |
XML رجوع در |
انیمیشنهای نوع property |
animator |
R.animator |
@animator/<file> |
انیمیشنهای نوع Tween |
anim |
R.anim |
@anim/<file> |
فهرست رنگها |
color |
R.color |
@color/<file> |
تصاویر قابلنمایش |
drawable |
R.drawable |
@drawable/<file> |
الگوها |
layout |
R.layout |
@layout/<file> |
منوها |
menu |
R.menu |
@menu/<file> |
دادههای خام |
raw |
R.raw |
|
دادههای ساده |
values |
R.arrays |
|
|
|
R.bool |
@bool/<id> |
|
|
R.color |
@color/<id> |
|
|
R.dimen |
@dimen/<id> |
|
|
R.integer |
@integer/<id> |
|
|
R.string |
@string/<id> |
|
|
R.style |
@style/<id> |
دادههای XML |
xml |
R.xml |
|
|
درصورتی که نتوانستید منبع مورد نظر خود را در کلاس R پیدا کنید، مطمئن شوید که کلاس R مناسب را در کد برنامه وارد (import) کردهاید. منابع مربوط به سیستم نیز در کلاس android.R قرار دارند و ممکن است ناخوسته توسط اندروید استودیو به کد برنامه شما وارد شده باشند. |
منابع
انیمیشنهای نوع property[28] آن دسته از انیمیشنهایی را
تعریف میکند که میتوان با تعیین خاصههای (properties) انیمیشن مشخص کرد که آنها در
یک زمان مشخص و در طی یک مدت زمان معین چگونه روی صفحه به حرکت در خواهند آمد.
همانگونه که در لیست 2-4 نشان داده شده، این منابع بصورت فایلهای XML هستند که خاصههای انیمیشنها
در آنها تعریف شده است. اندروید انتظار دارد تا این فایلها در دایرکتوری src/res/animator قرار داده شوند.
لیست 2-4.
فایل منبع src/res/animator/example.xml
که در آن خواص یک انیمیشن نوع property تعریف شده است
<?xml
version="1.0" encoding="utf-8"?>
<set xmlns:android=
"http://schemas.android.com/apk/res/android">
<objectAnimator
android:propertyName="x"
android:duration="1000"
android:valueFrom="10"
android:valueTo="100"
android:valueType="intType" />
</set>
هنگامی که این خواص تعیین شدند، همانطور که در لیست 3-4 نشان داده شده، منبع مورد نظر میتواند در کدِ برنامه از طریق >نام فایل منبع R.animator.< مورد دسترسی قرار گیرد. در اینجا ”نام فایل منبع“ بعنوان شناسه منبع مورد استفاده قرار میگیرد.
لیست 3-4.
استفاده از منبع انیمیشن
در کدِ برنامه
AnimatorSet
animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(
this, R.animator.example);
منابع
انیمیشنهای نوع Tween[29] آن دسته انیمیشنهایی را
تعریف میکند که با اعمال یک سری تبدیلات ساده بر روی محتوای آنها میتوان مشخص کرد
که چگونه به حرکت درمیآیند. همانگونه که در لیست 4-4 نشان داده شده، این منابع
نیز بصورت فایلهای XML
هستند که در دایرکتوری src/res/anim
قرار داده میشوند. از ”نام فایل منبع“ بعنوان شناسه منبع استفاده میشود.
لیست 4-4. فایل منبع انیمیشن src/res/anim/twin.xml
<?xml
version="1.0" encoding="utf-8"?>
<set xmlns:android=
"http://schemas.android.com/apk/res/android">
<scale android:fromXScale="1.0"
android:toXScale="2.0"
android:duration="1000" />
<rotate android:fromDegrees="0"
android:toDegrees="180"
android:duration="1000" />
</set>
همانطور که در لیست 5-4 نشان داده شده، منبع میتواند در کدِ برنامه از طریق >نام فایل منبع R.anim.< مورد دسترسی قرار گیرد.
لیست 5-4. استفاده از فایل منبع نوع Tween
TextView
textView = (TextView) findViewById(R.id.hello_world);
Animation
animation = AnimationUtils.loadAnimation(
this, R.anim.tween);
textView.startAnimation(animation);
...........................................
برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.
سیستم
اندروید مجموعه جامعی از رابطهای کاربری (UI) را برای برنامههای
موبایل فراهم آورده. در این فصل ما به مباحثی همچون الگوهای ایستا و پویا، اجزاء
رابط کاربریِ ورودی و خروجی، و همچنین API مربوط به
قطعهها خواهیم
پرداخت که برای توسعه رابطهای کاربری پودمانی (modular)
از آنها استفاده میشود. از این به بعد هرجا از UI
نام برده شد، منظور از آن همان رابطِ کاربر است.
در سیستم
عامل اندروید، ساختار ظاهری UI برنامهها توسط الگوها (Layouts)
تعریف میشود. هر الگو زیر کلاسی از کلاس ViewGroup
است. هر الگو میتواند حاوی نماهای (Views)
منفرد و همچنین دیگر اجزای ViewGroup باشد. یک الگو بعنوان یک ViewGroup،
مسئولیت مشخص کردن مکان، و همچنین نمایش، اعضای آن در صحنه را بر عهده دارد.
سیستم
اندروید از دو روش برای اعلان الگو و اعضای آن استفاده میکند.
·
استفاده از منابع XML. در این روش الگو و اعضای آن میتوانند بصورت
XML تعریف شوند (یعنی در
داخل منابعی تعریف میشوند که به فرمت عادی XML هستند). این رویکرد باعث میشود
تا شکل ظاهری (presentation)
برنامه از چگونگی عملکرد (business
logic) آن مجزا شود. بدلیل اینکه اندروید قادر است از صفحاتی
با اندازهها و تراکمهای متفاوت پشتیبانی کند، تنها کاری که برنامه باید انجام
دهد این است که برای هر نوع صفحه یک الگوی XML متفاوت را فراهم آورد و نیاز نیست برای هر صفحه تغییری
در کد برنامه داده شود.
|
اندروید استودیو ابزارهای بصری لازم را در اختیار برنامه نویس قرار داده. از این ابزارها میتوان برای ایجاد و تغییر الگوهای مختلف را در طول توسعه برنامه استفاده کرد. |
· از طریق کُد برنامه و استفاده از APIهای مربوطه. سیستم اندروید کلاسهای میانجی و متدهایی را فراهم آورد که توسط آنها
براحتی میتوان الگوها و
اعضای آن را از درون کدِ برنامه اعلان، و یا آنها را دستکاری، کرد.
به منظور
سهولت بیشتر، کلمات استفاده شده برای اعلان الگوها در XML، و آنهایی که در API برنامه بکار میروند تا اندازه زیادی شبیه یکدیگرند.
هر چند
برای اعلان الگوها میتوان
از هر دو رویکرد استفاده کرد، ولی توصیه ما این است که برای تعریف رابط کاربری
اندروید از منابع XML استفاده کنید، مگر اینکه بدلیل نیازهای خاصی که برنامه دارد، نشود از این روش استفاده
کرد.
به منظور
اینکه الگوها بطور
صحیحی عمل کنند، لازم است تا اندازه فرزندان خود را بدانند، از جمله Viewها و اعضای ViewGroup تو در تو (nested).
به همین دلیل نیاز است تا کلیه اعضای View
و ViewGroup دو خاصه زیر را تعریف کنند:
·
android:layout_width: که پهنای عضو را مشخص میکند.
·
android:layout_height: که ارتفاع عضو را مشخص میکند.
پهنا و
ارتفاع هم میتوانند یک اندازه عددی به خود بگیرند، و هم میتوانند دو مقدار ثابت
زیر را بگیرند که بسته به شرایط، اندازه آنها را تغییر میدهد. این مقادیر ثابت
عبارتند از:
·
matchParent: در این حالت نماها میخواهند به بزرگی والد (parent)
خود باشند.
·
wrapContent: در این حالت نماها فقط میخواهند آنقدر
بزرگ باشند که محتوای جاری خود را در بر گیرند.
سیستم
اندروید مجموعهای از الگوهای معمول را فراهم آورده که میتوانند اکثر نیازهای
متداول را برآورده کند. شما از طریق این الگوهای معمول میتوانید هر نوع رابط
کاربری ایستا را که بخواهید تعریف کنید.
الگوی خطی (LinearLayout)[30] اعضای خود را بشکل خطی، و به صورت ستونهای
عمودی و یا به صورت سطرهای افقی، در کنار یکدیگر قرار میدهد. برای نمونه به شکل
1-5 نگاه کنید.
شکل 1-5. الگوی خطی، با اعضایی که بصورت افقی و عمودی درکنار
یکدیگر چیده شدهاند
همانطور
که در لیست 1-5 نشان داده شده، خاصه android:orientation[31] مربوط به عضو LinearLayout میتواند جهت (عمودی یا افقی) یک الگوی خطی را تعیین کند.
لیست 1-5.
یک
الگوی خطی که
جهت آن عمودی قرار داده شده
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
...
</LinearLayout>
خاصه android:orientation میتواند یکی از دو مقدار زیر را داشته باشد:
· horizontal: اعضا بصورت یک سطر افقی پشت سر هم قرار میگیرند.
·
Vertical: اعضا بصورت یک ستون عمودی به دنبال هم قرار
میگیرند.
اگر خاصه android:orientation مشخص نشده باشد، حالت پیشفرض برای الگوی خطی horizontal
است.
براساس
اندازه صفحه و جهت آن، یک LinearLayout اندازه اعضای فرزند خود را طوری تنظیم میکند که فضای
قابلاستفاده را پُر کنند. اینکار بصورت خودکار باعث میشود تا رابطِ کاربر بتواند
خود را با صفحاتی که اندازه متفاوت، و یا جهت متفاوت، دارند وفق دهد.
بطور پیشفرض فضا به طور مساوی میان اعضای فرزند توزیع میشود؛
ولی همانطور که در لیست 2-5 نشان داده شده، با استفاده از خاصه (android:layout_weight)[32] میتوان وزن متفاوتی را برای هر عضو فرزند
در نظر گرفت.
لیست 2-5. یک LinearLayout که نخستین عضو آن نسبت به بقیه وزن بیشتری
را دارا است
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button_1"/>
<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_2"/>
</LinearLayout>
همانطور که در شکل 2-5 نشان داده شده، دارا بودن وزن بیشتر باعث میشود تا عضو فرزند بتواند گسترش یابد و نسبت به اعضایی که وزن پایینتری دارند فضای بیشتری را پر کند.
شکل 2-5. یک LinearLayout که نخستین عضو آن وزن بیشتری داشته و فضای بیشتری را
اشغال کرده
درصورتی
که برای عضو فرزند هیچگونه android:layout_weight
مشخص نشده باشد، مقدار پیشفرض برای
آن 0 است.
به
طور پیشفرض، یک LinearLayout فرزندان
خود را بر حسب لبه بالایی آنها چیده و با یکدیگر همتراز میکند. خاصه android:layout_gravity[33] میتواند این
رفتار پیشفرض را تغییر دهد. خاصه android:layout_gravity میتواند برای تعیین موقیت یک نما، یک یا چندین مقدار را به خود بگیرد.
در
حالتی که جهت الگوی خطی افقی باشند از مقادیر زیر پشتیبانی میشود:
·
top: نما را
در بالای والد آن قرار میدهد.
·
center_vertical: نما را در وسطِ عمودی والدِ آن قرار میدهد.
·
bottom: نما را در پایین والد آن قرار میدهد.
در حالتی
که جهت الگو عمودی باشند از مقادیر زیر پشتیبانی میشود:
·
left: نما را
در سمت چپِ والد آن قرار میدهد.
·
center_horizontal: نما را در وسطِ افقی والدِ آن قرار میدهد.
·
right: نما را در سمت راستِ والد آن قرار میدهد.
تقریباً
میتوان کلیه UIها را با استفاده از چندین الگوی خطی، که به
صورت تودرتو چیده شدهاند، طراحی کرد؛ ولی اینکار همچنین باعث میشود که الگوی
نهایی خیلی پیچیدهتر شده و تغییر و نگهداری آن مشکل شود. به همین منظور سیستم
اندروید الگوی نسبی، یا RelativeLayout[34]، را برای برنامهنویسان فراهم
آورده تا بدون اینکه نیازی به الگوهای خطی تو در تو باشد، بتوانند رابطهای کاربری پیچیده را
طراحی کنند. برای نمونه به شکل 3-5 نگاه کنید.
شکل 3-5. یک الگوی نسبی (RelativeLayout)،
با عضوهایی که به صورت نسبی قرار گرفتهاند
یک الگوی
نسبی اعضای خود را به شکل نسبی مرتب میکند. موقعیت هر عضو فرزند میتواند نسبت به
عضوهای اطرافش، و یا والدش، مشخص شود. همانطور که در لیست 3-5 نشان داده شده، هر
عضو از یک RelativeLayout دارای یک یا چند خاصه است که روی هم رفته چگونگی قرار گرفتن این
عضو در صفحه را مشخص میکنند.
لیست 3-5. یک RelativeLayout
با اعضایی که موقعیت نسبی خود را مشخص کردهاند
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<EditText
android:id="@+id/edit_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_toEndOf="@+id/label_username" />
<TextView
android:id="@+id/label_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/edit_username"
android:text="Username:" />
<Button
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/edit_username"
android:layout_alignLeft="@id/edit_username"
android:text="Login" />
<CheckBox
android:id="@+id/checkbox_remember_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/edit_username"
android:layout_alignParentRight="true"
android:layout_alignBottom="@id/button_login"
android:text="Remember username?" />
</RelativeLayout>
موقعیت قرارگیری نسبت به یک نمای گیرداده
شده
· android:layout_above: لبه پایینی را در بالای گیره تعیین شده
قرار میدهد.
·
android:layout_alignBaseline: خطِ مبنا (baseline)
را روی خط مبنای نمای گیرداده شده قرار
میدهد.
·
android:layout_alignBottom: لبه پایین را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_alignEnd: لبه پایانی را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_alignLeft: لبه چَپ را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_alignRight: لبه راست را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_alignStart: لبه شروع را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_alignTop: لبه بالا را طوری قرار میدهد که با نمای
گیرداده شده تطابق
داشته باشد.
·
android:layout_below: لبه بالا را در زیر نمای گیر داده شده قرار میدهد.
·
android:layout_toEndOf: لبه شروع را طوری قرار میدهد که با لبه
پایانی نمای گیر داده شده تطابق
داشته باشد.
·
android:layout_toLeftOf: لبه راست را طوری قرار میدهد که با لبه چپِ
نمای گیر داده شده تطابق
داشته باشد.
·
android:layout_toRightOf: لبه چپ را طوری قرار میدهد که با لبه
راستِ نمای گیر داده شده تطابق
داشته باشد.
·
android:layout_toStartOf: لبه پایان را طوری قرار میدهد که با لبه
شروع نمای گیر داده شده تطابق
داشته باشد.
خاصههای
مربوط به RelativeLayout که در زیر آمده،
موقعیت یک نما را
نسبت به نمای والد آن مشخص میکند:
·
android:layout_alignParentBottom: لبه پایین را طوری قرار میدهد که با نمای
والد تطابق داشته باشد.
·
android:layout_alignParentEnd: لبه پایانی را طوری قرار میدهد که با نمای
والد تطابق داشته باشد.
·
android:layout_alignParentLeft: لبه چپ را طوری قرار میدهد که با نمای
والد تطابق داشته باشد.
·
android:layout_alignParentRight:
لبه راست را طوری قرار میدهد
که با نمای والد تطابق داشته باشد.
·
android:layout_alignParentStart: لبه شروع را طوری قرار میدهد که با نمای
والد تطابق داشته باشد.
·
android:layout_alignParentTop: لبه بالا را طوری قرار میدهد که با نمای
والد تطابق داشته باشد.
·
android:layout_centerHorizontal: اگر مقدار این خاصه true
باشد، آنگاه این نما بطور
افقی در وسط والدش قرار میگیرد.
·
android:layout_centerInParent: اگر مقدار این خاصه true باشد، آنگاه این نما هم
بطور افقی و هم بطور عمودی در وسط والدش قرار میگیرد.
·
android:layout_centerVertical:
اگر مقدار این خاصه true
باشد، آنگاه این نما بطور
عمودی در وسط والدش قرار میگیرد.
|
در حالتی که نمای گیر داده شده نامریی باشد، آنگاه میتوان مقدار خاصه android: layout_align WithParent IfMissing را true قرارداد تا در مواقعی که نمای گیرداده شده پیدا نباشد از والد بعنوان گیره استفاده شود. |
...........................................
برای ادامه مطالعه این فصل نسخه کامل PDF کتاب
را تهیه کنید.
اگرچه همه
برنامههای اندرویدی بصورت تمام-صفحه اجراء میشوند، با این حال هنوز هم سیستم
اندروید برخی از ویژگیهای پنجره مانند، مثل نوار فعالیت، پنجرههای زودگذر،
دیالوگها، و اخطار دهندهها، را در دسترس قرار میدهد. ما در این فصل مروری
خواهیم داشت بر روی این ویژگیهای پنجره مانند. هرچند که همه برنامههای اندرویدی
از دیالوگها و پنجرههای زودگذر استفاده نمیکنند، ولی تقریباً همه برنامهها از
نوار فعالیت و اخطار دهندهها استفاده میکنند تا برای کاربر یک تجربه هموار و
ثابت را مهیا کنند.
سیستم
اندروید از طریق نوار فعالیت (Action Bar)[36] ویژگیهای پنجرهمانندی را فراهم میکند که
به کاربر کمک میکند بداند چه برنامهای درحال اجراء است، و یا موقعیت او را در برنامه
مشخص کند، و یا اینکه بداند فعالیتهای مهم برنامه کدامها هستند و چگونه میتوان
میان آنها حرکت کرد.
|
آیکُنی که در سمت راست نوار فعالیت قرار دارد و سه نقطه عمودی را نشان میدهند، به منوی سرریز (overflow menu) شناخته میشود. هنگامی که روی آن کلیک میشود، یک منوی پایین رونده را نمایش میدهد که در آن فهرستی از فعالیتهایی که بطور مستقیم در نوار فعالیت دیده نمیشوند را برای کاربر نشان میدهد. |
همانطور
که در شکل 1-6 دیده میشود، نوار فعالیت شامل موارد زیر است:
·
آیکُن و عنوان برنامه.
·
آیکُنها و برچسبهای مربوط به
فعالیتهای مهم برنامه، و همچنین درصورتی که بدلیل محدودیت نوار فعالیت، فهرست کلیه فعالیتها
نتوانند در نوار جا داده شوند، یک منوی سرریز در سمت راست نوار نمایش داده میشود.
·
پشتیبانی از حرکت در داخل
برنامه (Navigation) با استفاده از دکمه Back، tabها،
و منوهای پایینرونده.
شکل 1-6. یک نوار فعالیت و اجزاء آن
برای
اولین بار APIهای مربوط به نوار فعالیت در API سطح 11 معرفی شد، ولی از
طریق کتابخانه پشتیبان اندروید میتوان
برای سطوح پایینتر نیز از آن استفاده کرد. با شروع API
سطح 11، با استفاده از تِم (theme)
پیشفرضTheme.Holo میتوان در کلیه اکتیویتیها به ActionBar دسترسی داشت. همانطور که در لیست 1-6 دیده میشود، برنامه هر زمان که
بخواهد میتواند با فراخوانی متد getActionBar [37] از کلاس Activity به نمونهای از ActionBar
دسترسی پیدا کند.
لیست 1-6.
گرفتن نمونهای از ActionBar
از اکتیویتی
ActionBar
actionBar = getActionBar();
بدلیل
اینکه از هنگام ارائه API سطح 11
به بعد، برنامه بطور پیشفرض یک نوار
فعالیت دارد، درصورتی که برنامه نیازی به آن نداشته باشد، همانطور که در لیست 2-6
نشان داده شده، میتواند به آسانی با فراخوانی متد hide[38] آن را پنهان کند.
لیست 2-6.
برداشتن نوار فعالیت
@Override
protected void onCreate(Bundle savedInstanceState) {
ActionBar actionBar = getActionBar();
actionBar.hide();
}
نوار فعالیت جای مناسبی برای نشان دادن فعالیتهای مرتبط با کانتکس فعلی است. این فعالیتها معمولاً به شکل یک آیکُن، و بسته به اینکه چگونه اعلان شدهاند، برخی اوقات نیز با یک آیکن و هم با یک متن، بر روی نوار فعالیت نمایش داده میشوند.
همانطور
که در لیست 3-6 نشان داده شده، فعالیتها به شکل منابعِ مِنو در دایرکتوری res/menu
ذخیره میشوند.
لیست 3-6. محتوای فایل
res/menu/menu_actions.xml
<menu xmlns:android=
"http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_action_search" />
<item
android:id="@+id/action_save"
android:title="@string/action_save"
android:icon="@drawable/ic_action_save" />
<item android:id="@+id/action_share"
android:title="@string/action_share"
android:icon="@drawable/ic_action_share" />
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:icon="@drawable/ic_action_settings"
android:showAsAction="never" />
<item android:id="@+id/action_about"
android:title="@string/action_about"
android:icon="@drawable/ic_action_about"
android:showAsAction="never" />
</menu>
هر فعالیت از طریق تَگ <item> تعریف میشود که دارای یک ID، یک آیکُن، و یک عنوان است. تگ <item> همچنین میتواند پارامترهایی را بگیرد که تعیین میکنند چگونه این فعالیت باید در نوار فعالیت نمایش داده شود.
...........................................
برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.
سیستم
عامل اندروید برای ذخیره سازی دادههای برنامه چندین گزینه را فراهم آورده است. بدلیل اینکه انتخاب این گزینهها به ماهیت
برنامه و کاربردهای آن بستگی دارد، هیچ گزینهای در این میان نیست که از بقیه بهتر
باشد. در این فصل ما مروری خواهیم داشت بر روشهای مختلفی که سیستم اندروید برای
ذخیرهسازی دادهها در اختیار کاربر قرار میدهد، روشهایی همچون: فایلهای ساده، اولویتهای
مشترک (shared
preferences)، و پایگاههای دادهای رابطهای (relational
database). بعداً در همین فصل مروری نیز خواهیم داشت بر سرویس پشتیبانگیر
اندروید (Android
Backup Service)، که برای پشتیبانی و بازیابی دادههای برنامه به کلاد (cloud)
از آن استفاده میشود تا کار ارتقاء (upgrade)
و بازنشانی (reset)
دستگاهها یکنواخت و آسان شود.
مانند
سیستمعاملهای دیگر، در سیستم عامل اندروید نیز استفاده از فایل آسانترین راه
برای نگهداری دادهها است. شما برای اینکار میتوانید از APIهای مربوط به I/O (ورودی و
خروجی)، که توسط زبان جاوا فراهم
آمده، استفاده کنید. سیستم اندروید دو نوع ذخیرهساز را فراهم آورده: یکی ذخیرهساز
داخلی است (که غیرقابل برداشتند) و دیگری ذخیرهساز خارجی (چیزهایی مانند کارتهای SD که براحتی میتوان
آنها را برداشت).
بطور پیشفرض دادههایی که در ذخیرهساز داخلی ذخیره میشوند
فقط به برنامهای اختصاص دارند که آنها را ذخیره کرده. هنگامی که برنامه نصب شده
از روی دستگاه برداشته میشود (uninstall میشود)، اندروید همراه با خود برنامه، کلیه این
فایلها را نیز حذف میکند. برای ساختن یک فایل جدید در ذخیرهساز داخلی دستگاه
میتوان از متد Context.openFileOutput[39] مربوط کانتکس جاری، مثلاً اکتیویتی فعلی، استفاده کرد.
همانطور که در لیست 1-7 نشان داده شده، این متد یک شیء بصورت java.io.OutputStream
را بازمیگرداند که میتوان برای نوشتن در یک فایل از آن استفاده کرد.
لیست 1-7. بازکردن یک فایل در ذخیرهساز داخلی برای الحاق
دادهها (Appending)
try {
FileOutputStream output
=
openFileOutput("file.dat", MODE_APPEND);
try
{
// write to output stream
} finally {
output.close();
}
} catch (IOException e) {
e.printStackTrace();
}
متد getFileOutput دو پارامتر میگیرد؛ یکی نام فایلی که باید باز و یا ایجاد شود، و دیگری حالتی که فایل باید باز شود. لیستی از فلَگها (flags) که میتوان از آن برای مشخص کردن اینکه چگونه فایلها باید توسط API باز شوند ”حالتِ فایل“ را تشکیل میدهند. حالتِ فایل میتواند ترکیبی از فلگهای زیر باشد:
· MODE_PRIVATE:
اگر هیچ حالتی ذکر نشود، این حالت پیشفرض است. در این حالت فقط خود برنامهِ فراخوان میتواند
به فایل دسترسی داشته باشد.
·
MODE_APPEND: درصورتی که فایل از
قبل موجود است، به اندروید فرمان میدهد بجای اینکه آن را پاک کند، آن را در حالت
الحاق باز کند.
|
سیستم اندروید از حالتهای دیگری مثل MODE_WORLD_READABLE و MODE_WORLD_WRITABLE نیز پشتیبانی میکند، ولی حالا دیگر نباید از این حالتها استفاده کرد. برای به اشتراک گذاری فایلها با برنامههای دیگر، بجای آینها شما باید از مکانیزمهای اصولی دیگری استفاده کنید (مثلاً فراهم کنندههای محتوا). |
همانطور
که در لیست 2-7 نشان داده شده، شما برای خواندن یک فایل میتوانید از متد [40]Context.openFileInput
استفاده کنید.
لیست 2-7. باز کردن یک فایل در ذخیره کننده داخلی برای
خواندن
File
input = openFileInput("file.dat");
بدلیل
اینکه در بیشتر دستگاههای اندرویدی ذخیره کننده داخلی فضای نسبتاً کمی دارد، ما
توصیه میکنیم برای ذخیره فایلهای بزرگ از ذخیره کننده خارجی استفاده کنید. در
صورتی که کاربر ذخیره ساز انبوه یو.اس.بی (USB mass
storage) را فعال کند تا از این طریق بتوان ذخیره کنندههای
خارجی را روی کامپیوتری که به دستگاه متصل میشود برای انتقال فایل سوار کرد (mount)،
فایلهایی که در ذخیره کننده خارجی دستگاه ذخیره شدهاند میتوانند توسط همه
برنامهها موجود در کامپیوتر
مورد دستیابی قرار گیرند (هم برای خواندن و هم برای نوشتن).
|
هنگامی که ذخیره کنندههای خارجی بصورت یک ذخیره سازی انبوه یو.اس.بی در یک کامپیوتر سوار میشوند، این ذخیره کنندهها برای برنامههایی که بر روی دستگاه درحال اجرا هستند غیر قابل دستیابی میشوند. |
استفاده
از ذخیره کنندههای خارجی برای خواندن و نوشتن فایلها به مجوزهای خاصی نیاز
دارد. همانطور که در لیست 3-7 نشان داده شده، برنامه باید این مجوزها را در طول
نصب برنامه از طریق فایل اعلانیه درخواست
کند.
لیست 3-7. اعلان درخواست مجوز برای نوشتن در ذخیره کننده خارجی در فایل
اعلانیه برنامه
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
دستیابی
به ذخیره کنندههای خارجی توسط دو مجوز زیر تعیین میشود:
·
READ_EXTERNAL_STORAGE: برای خواندن از ذخیره
کنندههای خارجی.
·
WRITE_EXTERNAL_STORAGE: هم برای نوشتن، و هم
برای خواندنِ ذخیره کنندههای خارجی.
...........................................
برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.
سیستم
اندروید برای اندازهگیری مکان، حرکت، جهت، و ویژگیهای محیطِ اطراف، از حسگرهای
داخلی مختلفی پشتیبانی میکند. این حسگرها توسعه نرمافزارهای محیط-آگاه را برای سیستم عامل
اندروید ممکن میکند. ما در این فصل به بررسی انواع مختلف حسگرها و موقعیتیابهایی
که توسط اندروید از آنها پشتیبانی میشود خواهیم پرداخت و همچنین APIهایی را بررسی میکنیم که میتوانند با این
حسگرها و موقعیتیابها تعامل کنند.
برنامههای
اندرویدی ازطریق APIهای sensor
میتوانند حسگرهای دستگاه را زیرنظر داشته باشند تا از این طریق تجربهای گیرا و
کاملاً محاورهای را برای کاربر فراهم کنند. برای نمونه، اغلب بازیها بطور گستردهای
از حسگرهای دستگاه استفاده میکنند تا بتوانند به شکلی طبیعی از کاربر ورودی
دریافت کنند. در این بخش ما APIهایی را بررسی میکنیم که برای تعامل با این حسگرها توسط اندروید فراهم آمده.
سیستم
اندروید از طریق سرویس حسگر (Sensor
Service) دسترسی به حسگرهای دستگاه را فراهم میکند. برنامه میتواند
از طریق APIهای SensorManager[41] به سرویس حسگر
دسترسی پیدا کند. همانطور که در لیست 1-8 نشان داده شده، از طریق متد getSystemService
میتوان نمونهای از SensorManager
را بدست آورد.
لیست 1-8. گرفتن نمونهای از SensorManager
SensorManager
sensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);
اندروید از حسگرهای گوناگونی پشتیبانی میکند.
برخی از این حسگرها دستگاههای سختافزاری واقعی هستند که بخشی از خود دستگاهاند،
و برخی دیگر حسگرهای مبتنی-بر نرمافزار هستند که اساس اندازهگیری آنها به ترکیبی
از حسگرهای دیگر تکیه دارد. برای هر یک از این حسگرها در کلاسِ Sensor[42] مجموعهای از ثابتها تعریف شده:
·
TYPE_ACCELEROMETER: حسگر شتابسنج، که
شتاب را بر حسب m/s2 اندازهگیری میکند.
·
TYPE_AMBIENT_TEMPERATURE: حسگر دمای محیط، که
دمای محیط را بر حسب درجه سانتیگراد اندازهگیری میکند.
·
TYPE_GAME_ROTATION_VECTOR: حسگرِ بردارِ چرخشِ
تنظیم نشده (کالیبره نشده).
· TYPE_GEOMAGNETIC_ROTATION_VECTOR: حسگرِ بردارِ چرخشِ هندسی.
·
TYPE_GRAVITY: حسگرِ گرانشی.
·
TYPE_GYROSCOPE: حسگرِ گردشی
(ژیروسکوپ).
·
TYPE_GYROSCOPE_UNCALIBRATED: حسگرِ گردشی تنظیم
نشده (کالیبره نشده).
·
TYPE_HEART_RATE: حسگرِ ضربانِ قلب.
·
TYPE_LIGHT: حسگرِ نوری.
· TYPE_LINEAR_ACCELERATION: حسگر شتاب خطی.
·
TYPE_MAGNETIC_FIELD: حسگر میدان
مغناطیسی.
·
TYPE_MAGNETIC_FIELD_UNCALIBRATED: حسگر میدان مغناطیسی تنظیم نشده.
· TYPE_PRESSURE: حسگر فشار.
· TYPE_PROXIMITY: حسگر مجاورت.
· TYPE_RELATIVE_HUMIDITY: حسگر رطوبت نسبی.
· TYPE_ROTATION_VECTOR: حسگر بردار چرخش.
· TYPE_SIGNIFICANT_MOTION: حسگر حرکت شدید.
· TYPE_STEP_DETECTOR: حسگر تشخیص گام.
از طریق
ثابتهای حسگر که در بالا ذکر شد، میتوان از متد getDefaultSensor
کلاسِ SensorManager استفاده کرد تا برای
انواع مختلف حسگرها، حسگر پیشفرص را بدست آورد (لیست 2-8).
|
گرچه استفاده از اکثر حسگرها به مجوز خاصی نیاز ندارد، حسگرهای جدیدی همچون حسگر جسمی، و حسگر ضربان قلب، به مجوز android. Permission .BODY_SENSORS نیاز دارند. |
لیست 2-8. گرفتن حسگر پیشفرض برای حسگر مورد نظر
Sensor
sensor = sensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
if (sensor == null) {
// Unable to get the
sensor
} else {
// Sensor can be used
}
متد getDefaultSensor تنها میتواند حسگرِ پیشفرضِ یک حسگر خاص را بازگرداند. درصورتی که برای یک حسگر خاص، دستگاه به بیش یک حسگر مجهز باشد، برنامه بجای متد قبلی میتواند از متد getSensorList[43] استفاده کند. این متد نوع حسگر مورد نظر را گرفته و لیستی از حسگرها، که با حسگر داده شده مطابقت داشته باشند را بازمیگرداند. همانطور که در لیست 3-8 نشان داده شده، برنامه میتواند این لیست را بررسی کرده و براساس ویژگیهای آنها (مثلاً حسگر چرخشی)، یکی را که مناسب است انتخاب کند.
لیست
3-8. انتخاب یک حسگر بر
اساس دقت آن
List<Sensor>
sensors = sensorManager.getSensorList(
Sensor.TYPE_ACCELEROMETER);
Sensor
choosen = null;
if (sensors != null) {
for (Sensor sensor : sensors) {
if (choosen == null
|| choosen.getResolution() > sensor.getResolution()) {
choosen = sensor;
}
}
}
...........................................
برای ادامه مطالعه این فصل نسخه
کامل PDF کتاب را تهیه کنید.
پشتیبانی
از رسانهها، و دسترسی به یک دوربین تفکیک-بالا از هیجانانگیزترین ویژهگیهای
سیستم اندروید است. در برنامههای اندرویدی از هر دو این موارد بطور گسترده
استفاده میشود. سر و کار داشتن با رسانهها در یک دستگاه موبایل چالشهای خاص خود
را دارد، و به این منظور سیستم اندروید برای برنامههای چندرسانهای APIهای کاملی را تدارک دیده. در این فصل مروری
کوتاهی بر روی این APIها خواهیم داشت.
اندروید
از طریق سرویسِ android.media.AudioManager[44] دسترسی به کنترلهای صوتی را
فراهم میآورد. همانطور که در لیست 1-9 نشان داده شده، این سرویس میتواند از طریق
درخواستِ سرویسِ سیستمی Context.AUDIO_SERVICE از کانتتکس جاری بدست آید.
لیست 1-9. گرفتن نمونهای از AudioManager از کانتکس جاری
AudioManager
audioManager = (AudioManager)
getSystemService(Context.AUDIO_SERVICE);
دستگاههای
اندرویدی به دستگاههای ورودی و خروجی صوتی، از قبیل بلندگو و میکروفون، مجهز هستند. در این نوع دستگاهها،
از هدفونهای بلوتوث نیز بعنوان دستگاههای صوتی خارجی پشتیبانی میشود. کلاسِ AudioManager متدهایی را ارائه میکند که توسط آنها میتوان وضعیت اینگونه دستگاهها را
بررسی کرد. همچنین توسط این کلاس میتوان این دستگاهها را در برنامه فعال و یا
غیرفعال کرد.
میکروفون (Microphone)
به دستگاه اندرویدی اجازه میدهد
تا ورودی صوتی را دریافت کند. هنگامی که به ورودی صوتی نیاز نباشد، میتوان
میکروفون را صامت کرد
(mute). کلاس AudioManager متدهایی را برای بررسی وضعیت فعلی میکروفون، و همچنین فعال و غیرفعال کردن آن
ارائه میدهد.
همانطور
که در لیست 2-9 نشان داده شده، با استفاده از متد isMicrophoneMute
کلاسِ AudioManager میتوان بررسی کرد که آیا میکروفون فعال یا غیرفعال است.
لیست 2-9. بررسی اینکه میکروفون فعال است
if (audioManager.isMicrophoneMute()) {
// stop streaming audio input
}
همانطور
که در لیست 3-9 نشان داده شده، برنامه میتواند با استفاده از متد setMicrophoneMute
کلاسِ AudioManager
میکروفون را
فعال و یا غیرفعال کند.
لیست 3-9. غیرفعال کردن میکروفون
audioManager.setMicrophoneMute(true);
تقریباً
همه دستگاههای اندرویدی یک بلندگو (Speakerphone)
دارند. بلندگو به کاربر اجازه میدهد تا بدون اینکه نیازی به چسباندن دستگاه به
گوش خود داشته باشد، بتواند خروجی صوتی آن را از فاصله نزدیک بشنود. کلاس AudioManager متدهایی را برای بررسی فعال و غیرفعال بودن بلندگو، و همینطور درصورت لزوم
هدایت خروجی صوتی به آن را ارائه میدهد.
همانطور
که در لیست 4-9 نشان داده شده، برنامه میتواند با استفاده از متد isSpeakerphoneOn[45] کلاس AudioManager بررسی
کند که آیا صوت از طریق بلندگو پخش
میشود یا نه.
لیست 4-9. بررسی اینکه بلندگو روشن است یا نه
if (audioManager.isSpeakerphoneOn()) {
// disable speakerphone button
}
همانطور
که در لیست 5-9 دیده میشود، برای روشن و خاموش کردن بلندگو، کلاسِ AudioManager متد setSpeakerphoneOn را فراهم آورده.
لیست 5-9. خاموش و روشن کردن بلندگو
audioManager.setSpeakerphoneOn(true);
اندروید
بین جریانهای صوتی (Audio
Streams) مختلف بر حسب کاربرد آنها تفاوت قائل میشود، و اجازه
میدهد که هر گروه از این جریانهای صوتی بطور مستقل کنترل شوند. این باعث میشود
تا کاربر بتواند برای اصوات متفاوت، مثل زنگ شماطه (alarm clock)،
زنگ تلفن، و پخش موسیقی، سطوح مختلفی از درجه صدا را تنظیم کند.
|
بدلیل اینکه اندروید بصورت خودکار نمیتواند تشخیص دهد که منظور از اصواتی که توسط برنامه پخش میشوند چیست، این برعهده برنامهنویس است که مطابق با منظور اصلی برنامه، از جریان صوتی مناسبی برای آن استفاده کند. |
[1] - IPC= Inter-Process Communication.
[2] AIDL= Android Interface Definition Language برای اطلاعات بیشتر به این آدرس رجوع کنید :
http://developer.android.com/guide/components/aidl.html
[3] - همانطور که خواننده میداند، بدلیل اینکه دستگاههای موبایل به اندازه کافی برای توسعه نرمافزار قدرتمند نیستند، برای تولید برنامههای موبایل باید از کامپیوترهای رومیزی و یا لپتاپ استفاده شود. حتی اگر طی روندی که امروز با آن روبرو هستیم، تا چند سال آینده دستگاههای موبایل بهاندازه کامپیوترهای رومیزی امروز قدرتمند شوند، بدلیل اندازه کوچک صفحه نمایش آنها و نداشتن ابزارهایی مانند کیبورد و ماوس، باز هم توسعه و ساخت برنامههای پیچیده برروی دستگاههای موبایل کار راحتی نخواهد بود، مگر اینکه آنها را به صفحه نمایشهای بزرگتر و یا صفحه کلید متصل کرد، که در اینصورت آنها دیگر شباهتی به دستگاه موبایل نخواهند داشت! البته ساخت برنامههای ساده در چنین دستگاههایی امکانپذیر است (مترجم).
[4] - YAFFS2 = Yet Another Flash File System.
[5] - SSL = Secure Socket
Layer
[6] - TLS = Transport
Level Security
[7] -
ART = Android Runtime
[8] - JIT= Just in Time
[9] - AOT= Ahead Of Time
[10] - DEX= Dalvik Executable
[11] - در برخی کتابها Forking به شاخهشاخه شدن نیز ترجمه شده (مترجم).
[12] - https://developer.android.com/about/dashboards/index.html
[13] - http://developer.android.com/tools/support-library/features.html
[14] - NDK=
Native Development Kit
[15]
- اصطلاح بومی در اینجا به تولید برنامههایی دلالت دارد که بجای اینکه خروجی
کامپایلر این برنامهها بصورت بایتکُد باشد (مثل خروجی برنامههایی که به زبانهای
Java و C# نوشته شدهاند)، خروجی آنها
بصورت کُدهای زبان ماشین است که
زبان بومی دستگاه محسوب میشود و پردازنده میتواند مستقیماً آنها را درک و
پردازش کند (مترجم).
[16] - ADT= Android
Development Tools
[17] - http://developer.android.com/sdk/installing/studio.html
[18] - JDK= JAvA Development
Kit
[19]-
JRE= JAvA Runtime Edition
[20]
0 Activity به معنای
فعالیت است و یکی از آن اصطلاحات کممایهای است که به تازگی به جمع اصطلاحات
کامپیوتری اضافه شده. در متن این کتاب هرجا به اکتیویتی برخورد شود منظور از آن
همان لغت ”فعالیت“ است، ولی بدلیل اینکه درجاهایی از متن این کتاب نیاز بوده تا از
لغت فعالیت به معنای عام آن
استفاده شود و این استفاده ارتباطی با معنی آن در اندروید ندارد، در اینجا ترجیح
داده شده تا برای تفکیک این لغات از هم، از املای فارسی لغت ”Activity“ برای اشاره به معنی
آن در اندروید استفاده شود.
[21] - UI = User
Interface
[22] - http://developer.android.com/reference/android/app/Activity.html
[23] - tag
[24] - http://developer.android.com/guide/topics/manifest/activity-element.html
[25]
- در فرهنگ اصطلاحات زبان جاوا به
کلاسی که کلاسهای دیگر از آن منشعب میشود کلاس بالایی یا super class میگویند.
(مترجم)
[26] - http://developer.android.com/reference/android/os/Bundle.html
[27] - http://developer.android.com/reference/android/os/Parcel.html
[28] -
http://developer.android.com/guide/topics/graphics/prop-animation.html
[29] -
http://developer.android.com/guide/topics/graphics/view-animation.html#tween-animation
[30] -
http://developer.android.com/reference/android/widget/LinearLayout.html
[31] -
http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:orientation
[32] - http://developer.android.com/reference/android/widget/LinearLayoutLayoutParams.html#attr_android:layout_weight
[33]- http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html#attr_android:layout_gravity
[34] - http://developer.android.com/reference/android/widget/RelativeLayout.html
[35] - http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html
[36] - http://developer.android.com/reference/android/app/ActionBar.html
[37] - http://developer.android.com/reference/android/app/Activity.html#getActionBar()
[38] - http://developer.android.com/reference/android/app/ActionBar.html#hide()
[39] - http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,int)
[40] - http://developer.android.com/reference/android/content/Context.html#openFileInput(java.lang.String).
[41] - http://developer.android.com/reference/android/hardware/SensorManager.html
[42] - http://developer.android.com/reference/android/hardware/Sensor.html
[43] - http://developer.android.com/reference/android/hardware/SensorManager.html#getSensorList(int)
[44] - http://developer.android.com/reference/android/media/AudioManager.html
[45] - http://developer.android.com/reference/android/media/AudioManager.html#isSpeakerphoneOn()